Spring解决循环依赖
2021-03-19 13:40:13 2 举报
Spring解决循环依赖
作者其他创作
大纲/内容
加入三级缓存后,serviceA开始进行属性注入
getSingleton(A)
createBeanInstance(b)
B完成属性填充开始初始化B
populateBean()
addSingleton(B)
getSingleton
getBean(A)
如果对象实现了AOP那么这里得到的就是一个代理对象
doCreateBean()
这里需要理解一下什么是早期bean?刚刚实例化好的bean就是早期的bean,此时bean还未进行属性填充,初始化等操作@1:通过addSingletonFactory用于将早期的bean暴露出去,主要是将其丢到第3级缓存中
A完成创建,成为完整对象被放到单例池中,并返回
B完成创建,成为完整对象,把B加到一级缓存中
创建A
后续的过程serviceA开始注入依赖的对象,发现需要注入serviceB,会再从容器中获取serviceB,而serviceB的获取又会走上面同样的过程实例化serviceB,然后将serviceB提前暴露出去,然后serviceB开始注入依赖的对象,serviceB发现自己需要注入serviceA,此时去容器中找serviceA,找serviceA会先去缓存中找,会执行getSingleton(\"serviceA\
然后进入下面方法,会依次尝试从3级缓存中查找bean,注意下面的第2个参数,为ture的时候,才会从第3级中查找,否则只会查找1、2级缓存
A完成创建并返回
这里@1和@2是关键代码,先来看一下@1,这个是一个ObjectFactory类型的,就是刚才作为lambda表达式传入的
addSingletonFactory()
从容器中获取serviceB
getSingleton(b) == null
doGetBean()
//判断是否需要暴露早期的bean,条件为(是否是单例bean && 是否允许提前暴露 && bean名称存在于正在创建的bean名称清单中)
刚开始,3个缓存中肯定是找不到的,会返回null,会接着执行下面代码准备进行创建
addSingleton()
A创建完毕之后,会调用addSingleton()将其加入到单例池中
返回完整B对象给AA开始完成属性填充
注意:这里存入的是一个lambda表达式在未执行getObject()前lambda并不会执行
该方法执行之后,serviceA就被丢到第3级的缓存中了。
getBean(b)
B获取A的早期引用
返回A的原始对象给B
@1:查看缓存中是否已经有这个bean
收藏
收藏
0 条评论
下一页