Spring循环依赖
2022-10-03 01:33:03 0 举报
Spring循环依赖
作者其他创作
大纲/内容
第一次这里从各级中拿到的是null。第二次才取出值,循环依赖下,取到的是未完成依赖注入的beanA。
完成 beanB 的初始化工作
解析BeanA的依赖,实例化BeanB
重载:开始创建bean实例
BeanA获取为null
addSingletonFactoryspan style=\"font-size: inherit;\
earlySingletonObjects
前站已添加缓存,此时不为null。将beanA从三级缓存挪到二级缓存。并返回
beanB 创建过程
完成 beanA 的初始化工作
afterSingletonCreation(beanA)
addSingletonCreationspan style=\"font-size: inherit;\
这个是从二级缓存池取出未完成依赖注入的beanA,但已经完成了AOP代理
beanFactory.getBean(beanName)
getBean(beanA)
将beanA存放到一级缓存,同时清除二级缓存的这个对象
createBeanInstance(beanA)
getBean(beanB)
value = beanfactory.resolveDependency()
resolveCandidate
添加到三级缓存
开始属性注入
singletonFactories
解析BeanB的依赖,实例化BeanA
getSingleton(beanB)==null
getSingletonspan style=\"font-size: inherit;\
beanA 创建前站(未注入 B 的依赖)
尝试从各级缓存获取bean
createBeanInstance(beanB)
singletonObjects
在这里创建完成后把beanName 从 singletonsCurrentlyInCreation集合中移除
此时 beanB 还未创建,所以为null
beanA 创建后续(完成 B 的注入)
renturn beanB
renturn beanA
beforeSingletonCreation()
doResolveDependency
将beanName添加到singletonsCurrentlyInCreation集合中,表示该bean正在被创建
getSingleton(beanA)==null
将beanB存放到一级缓存,同时清除二级缓存的这个对象
将beanA添加到三级缓存
整体流程如下:1、创建BeanA,此时属性未赋值2、暴露早期引用,将原始对象BeanA放入singletonFactories缓存3、解析依赖BeanB4、BeanB在实例化BeanA的时候,从缓存中获取BeanA的早期引用,BeanB实例化完成5、BeanA实例化完成
value = beanB(bean对象,此时的 b 已完成 a 的注入)
三级缓存
value = beanA(bean对象,此时的 a 还未完成 b 的注入)
创建bean对象
afterSingletonCreation(beanB)
0 条评论
下一页