循环引用解决(清楚getBean流程)
2021-11-03 17:51:08 0 举报
spring循环依赖
作者其他创作
大纲/内容
解决循环引用的关键一步addSingletonFactory
再检查singletonObjects
B赋值populateBean
再检查这里
B创建了B@3270
A@2684 (移除)
以下核心关注点,请放在容器的各种实例池的状态变化
B初始化
第二轮进行检查就变了
A赋值populateBean
B完成
2
先检查单例池
doCreateBean真正创建对象
a -> 工厂lamda(getEarlyBeanReference)第4删除这个
b-> 工厂lamda(getEarlyBeanReference)
从容器中自己获取
循环引用解决(清楚getBean流程)
singletonsCurrentlyInCreation正在创建的beanName
A创建了A@2864
a的名字加入集合
singletonFactories(单例工厂池)三级
1、移除singletonsCurrentlyInCreation2、放到单例池(一级缓存)3、移除factory池(清理三级缓存)
singletonObjects(单例池)一级
所有对象的真正池
0、获取A
检查缓存(参考右图)getSingleton(beanName)
B赋值结束
第二次为false
A完成
获取A参照上面
获取B
B@3270
进去获取A流程
赋值给A
主对象早期的临时池
A@2684
1、2
开始创建A的流程
3、再来这里b把三级缓存里面的提升到二级
a
循环依赖对象临时池
AutowiredAnnotationBeanPostProcessor感知到要自动装配B
bb完成以后移除
放缓存、earlySingletonObjects.remove(beanName)
收藏
收藏
0 条评论
下一页