关于Spring容器的初始化过程以及Bean的生命周期部分小结

注意本文仅仅是小结性内容,帮助个人记忆,没有详细代码,如果有错误或者更深层次的见解,读者请自行在评论区评论。
首先是IOC容器的初始化:
第一步是定位Resource,先创建一个BeanFactory,一般是实例化ApplicationContext容器,然后由ResourceLoader实现定位,因为Bean不仅是来自于代码,还可能来自于磁盘、jar包。
第二步是Beandefinition的载入,根据读取到的Resource数据封装进Beandefinition。Beandefinition和Bean的关系? (A BeanDefinition describes a bean instance)。 Beandefinition是对应Bean的封装,根据不同实现可以表达出任何形式的Bean。
第三步是Beandefinition的注册,由BeandefinitionRegistry接口实现,将Beandefinition注入到BeandefinitionMap(一个ConcurrentHashMap)中,即容器的本质是HashMap。

接下去就是尝试从容器中取Bean实例:
看容器中是否有singletionObject,没有就开始创建,利用反射进行实例化Bean对象,然后就是设置对象属性(populateBan,即依赖注入),在这一步中可能会存在着循环依赖的问题。何为循环依赖?即Bean A中存在一个成员变量Bean B,而Bean B中存在一个成员变量Bean A。此时IOC容器允许提前暴露Bean A的半成品(earlySingleton,即还没注入Bean B属性),到三级缓存(SingletonFactories)中,这里要注意的是如果Bean需要代理,(即实现AOP)则要在此处生成代理对象并且暴露到二级缓存中。(二级缓存存放早期对象,三级缓存预留了一个提前代理的口子,创造出代理对象后升级到二级缓存中)。二三级缓存中的未完成Bean在populateBean之前的addSingletonFactory时就存在,只是在产生循环依赖问题时才会去缓存中取。
关于循环依赖部分的内容,是概括了该博客的内容,有疑问的可以去了解。https://blog.csdn.net/u012098021/article/details/107352463

依赖注入完成以后,就是Bean生命周期的后面部分:检查Aware相关接口并设置相关依赖->BeanPostProcessor前置处理->检查是否是InitializingBean以决定是否调用AfterPropertiesSet方法->检查是否有自定义的init-method方法来进行初始化->BeanPostProcessor后置处理->使用Bean->容器关闭前调用distroy方法。
在这里插入图片描述
Bean的生命周期和作用域部分内容,详情可以参考这篇博客。
https://blog.csdn.net/fuzhongmin05/article/details/73389779

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值