Spring的属性初始化解析

本文详细介绍了Spring框架中Bean的初始化过程,包括属性值的设置、类型转换器的应用及Bean引用的处理等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值