spring-bean的实例化以及循环依赖解决
2023-01-09 11:24:39 7 举报
Spring中Bean的实例化及循环依赖的解决流程
作者其他创作
大纲/内容
singletonFactory.getObject();
addSingletonFactory
三级缓存中回调的就是这个getEarlyBeanRefrence
YES
一级缓存中没有
真正的创建bean
CycleRefA
这是CycleRefA已经成功被实例化,但是其中的cycleRefB依然是null的
initializeBean
单例校验
当前是单例bean&&允许循环依赖&&当前bean正在被创建
singletonFactory.getObject是个回调,回调的是getEarlyBeanReference
将当前bean放入三级缓存中,并从二级缓存中移除,三级缓存中的那个objectFactory就是下面的lambda
从singletonsCurrentlyInCreation中移除当前bean,表示当前bean已经初始化完毕
二级缓存里也没有
将beanName存入到singletonsCurrentlyInCreation中,主要就是为了标识当前bean正在被创建
从缓存中获取bean实例的流程,也是解决循环依赖的关键,spring bean的三级缓存
CycleRefA在内存中的样子
bean被实例化出来
返回bean
afterSingletonCreation(beanName);
getSingleton(beanName)
CycleRefB cycleRefB = null
getBean
boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&\t\t\t\tisSingletonCurrentlyInCreation(beanName));
NO
如果一级缓存中有,那就从一级缓存中返回,这时返回的是一个完整的bean
singletonFactories
创建好之后会存入到二级缓存同时移除三级缓存并返回结果
如果二级缓存中有,那就从二级缓存中拿,但是这时返回的bean还缺胳膊少腿
beforeSingletonCreation
添加到一级缓存中,并移除二级三级缓存
AOP等,beanPostProcessor的应用
这是一个内名类的回调,createBean方法是被定义在AbstractBeanFactory中的
createBeanInstance
earlySingletonExposure
如果二级缓存中没有,而且allowEarlyReference=true,也就是允许提前暴露,那么就从三级缓存中获取。三级缓存可以被理解为一个懒加载缓存,因为三级缓存返回的是一个ObjectFactory对象
earlySingletonObjects
singletonObjects
DI,依赖注入
校验成功
如果缓存中没有
populateBean
0 条评论
下一页