spring中单例实例的循环依赖
2020-06-28 10:29:55 5 举报
spring中单例实例的循环依赖
作者其他创作
大纲/内容
CircularRefA堆内存空间
YES
如果缓存中拿不到实例
getBean
无参构造函数实例化
createBeanInstance
singletonObjects
如果一级缓存中没有,则从二级缓存中拿
getSingleton(beanName)
populateBean
依赖注入
beanName存入singletonsCurrentlyInCreation容器
在这里就会触发依赖属性的getBean操作
CircularRefA
把beanName从singletonsCurrentlyInCreation容器中删除,表示实例化已经完成
如果二级缓存中没有且allowEarlyReference=true允许提前暴露,则从三级缓存中拿,这里从三级缓存中拿到的是一个ObjectFactory对象。
从缓存中拿实例
创建实例
addSingletonFactory
earlySingletonObjects
在这里设置了三级缓存,singletonFactories存储了ObjectFactory对象,在getObject方法中是getEarlyBeanReference方法调用
一级缓存:singletonObjects实例化完成后,往一级缓存中缓存实例,删除二,三级缓存
ObjectFactory.getObject()
先从一级缓存中拿,如果有直接返回
createBean
这时候A类的实例化还没有走完
这里就会调到匿名类中的createbean方法,该方法会创建完一个实例并返回
这时候堆内存的实例是还没有做依赖注入的,是一个光杆司令,已经有一个引用指向了这个对象
CircularRefB circularRefB==null
singletonFactories
NO
singletonObject = singletonFactory.getObject()
beforeSingletonCreation
boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&\t\t\t\tisSingletonCurrentlyInCreation(beanName));
singletonObject 对象缓存到二级缓存
addSingleton
这里是调到BeanPostProcessor接口,获取提前暴露的bean实例
afterSingletonCreation
0 条评论
回复 删除
下一页