Spring-IoC依赖注入

IoC依赖注入发生的时间

首先需要明确的是在IoC容器初始化之后,IoC容器已经开始管理Bean了,但是这时还不一定对管理的Bean进行了依赖注入
- 第一次通过getBean()方法向IoC容器所要bean时,IoC容器触发依赖注入
- 当Bean配置文件的标签设置了lazy-init属性时,IoC容器在解析Bean定义时进行预实例化,触发依赖注入,也即是随着ApplicationContext文件的加载而触发依赖注入,这是默认情况

Bean的生命周期

依赖注入发生的时间似乎可早可晚,这就不免让人思考一个问题,Spring中bean对象的生命周期问题,因为Spring的ApplicationContext容器在启动时会自动实例化所有singleton的Bean实例并缓存到容器中,那么这就开始了,接下来呢?

其实这是一个好坑

依赖注入的步骤

像上一篇IoC容器的初始化过程一样,涉及到了很多源码,这里只粘出总结出的步骤

IoC容器初始化完成
            ↓
AbstractBeanFactory通过getBean像IoC容器中获取bean,实际上是使用不同的模式来createBean:单例模式就是singleton的bean,原型模式就是不同的bean
            ↓
createBeanInstance()生成bean的Java对象实例;populateBean()对bean属性的依赖关系进行注入
            ↓
bean对象使用工厂方法和自动装配特性来进行bean实例化:
  参数匹配的构造方法或者相应的工厂方法进行实例化
  默认无参的构造方法使用反射和CGLIB进行实例化,bean中的方法被覆盖了就使用反射,反之就是CGLIB
            ↓
populateBean()方法对bean的属性开始注入
  属性值类型不需要转换的直接调用set方法
  属性值类型需要转换的,先解析在注入
            ↓
解析属性,各种ListSetMap属性,解析成目标属性
            ↓
对于集合类型的属性,解析后注入属性;非集合类型的属性,使用大量反射和内省机制(缺省办法),使用get获取旧值,再使用set赋予新值

至此,完成了IoC依赖注入

一些细节

再看很多博客时会注意到,大家对于IoC容器的初始化完成这个一点有不同的定义,有的是认为IoC容器加载解析注册完Bean配置之后就是完成了IoC容器的初始化,有的则还会包括接下来的Bean对象的依赖注入之后才是真正的完成了IoC容器的初始化
从源码上来看,我个人更愿意倾向于第一种,Bean对象的依赖注入的代码与IoC加载解析注册的代码有明显的分为不同阶段,这里就统一一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值