Spring加载一个Bean是通过其xml中定义的class属性来加载对象的.
通过Bean的name来得到Bean对象
那么Spring的Bean又怎么初始化Bean的属性值的呢。
看文档都是浮云,直接看源码比较清晰.
protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs)
通过beanName,BeanDefinition,bw,pvs来初始化属性.
1. 首先验证当前BeanDefinition有没有定义属性转换器,有的话,直接调用bw.setPropertyValues(mpvs);
2. 再验证有没有定义用户的类型转换器。
3. 设置属性值
接下来开始初始化Bean的属性值.
public void setPropertyValue(String propertyName, Object value)
根据属性名,属性值来初始化.
通过反映的方式设置此属性名为属性值.
有人可能会问题了,那如果此属性值指向另一个Bean呢,另一个Bean又指向另一个Bean,那怎么初始化
首先Bean会先初始化自己,然后再初始化Bean引用的一个Bean.[以此类推]
1. 首选检测Bean定义中的构建策略.比如ByName
2. Spring会先检测属性值是不是简单属性,如果是Bean属性那么不是简单属性了.
3. 判断Spring的Bean中是否包含不简单属性.
4. 然后初始化ref的Bean对象,然后注册依赖,再把Ref的Bean设置到
MutablePropertyValues,最后通过以上的set过程,就大功告成了
这段时间闲来无事,专心看了下Spring的源码,有很多可取之处,但也有很多的过度设计,比如接口的独立性,接口的边界不是很清晰,太多的接口,太多的抽象类,抽象类无限继续接口,接口继承接口,抽象类继承抽象类,看似有很多共性,但是可能一个Abstractor可能继承了多个共同的接口。图下:
[img]http://dl.iteye.com/upload/attachment/606772/290511fd-fdf6-3af9-9b8b-8e0258ed0fdf.jpg[/img]
通过Bean的name来得到Bean对象
那么Spring的Bean又怎么初始化Bean的属性值的呢。
看文档都是浮云,直接看源码比较清晰.
protected void applyPropertyValues(String beanName, BeanDefinition mbd, BeanWrapper bw, PropertyValues pvs)
通过beanName,BeanDefinition,bw,pvs来初始化属性.
1. 首先验证当前BeanDefinition有没有定义属性转换器,有的话,直接调用bw.setPropertyValues(mpvs);
2. 再验证有没有定义用户的类型转换器。
3. 设置属性值
接下来开始初始化Bean的属性值.
public void setPropertyValue(String propertyName, Object value)
根据属性名,属性值来初始化.
通过反映的方式设置此属性名为属性值.
有人可能会问题了,那如果此属性值指向另一个Bean呢,另一个Bean又指向另一个Bean,那怎么初始化
首先Bean会先初始化自己,然后再初始化Bean引用的一个Bean.[以此类推]
1. 首选检测Bean定义中的构建策略.比如ByName
2. Spring会先检测属性值是不是简单属性,如果是Bean属性那么不是简单属性了.
3. 判断Spring的Bean中是否包含不简单属性.
4. 然后初始化ref的Bean对象,然后注册依赖,再把Ref的Bean设置到
MutablePropertyValues,最后通过以上的set过程,就大功告成了
这段时间闲来无事,专心看了下Spring的源码,有很多可取之处,但也有很多的过度设计,比如接口的独立性,接口的边界不是很清晰,太多的接口,太多的抽象类,抽象类无限继续接口,接口继承接口,抽象类继承抽象类,看似有很多共性,但是可能一个Abstractor可能继承了多个共同的接口。图下:
[img]http://dl.iteye.com/upload/attachment/606772/290511fd-fdf6-3af9-9b8b-8e0258ed0fdf.jpg[/img]