spring 3级缓存、循环依赖 流程
2021-10-28 16:53:48 4 举报
spring 3级缓存、循环依赖
作者其他创作
大纲/内容
public class A { private B b; public A() { } public A(B b) { this.b = b; } public B getB() { return b; } public void setB(B b) { this.b = b; }}
正在创建
存在
false
没有
是否允许自动解析bean之间的以来问题,是否正在创建该单例
第2次创建A对象,A对象(或代理对象)存在2级缓存
返回缓存得对象或null
直接赋值
true
执行populateBean
首先查询缓存中是否有A对象
getEarlyBeanReference:如果A对象需要代理对象,会在此时创建代理对象
doGetBean
缓存中是有有B对象
否
买有
查询缓存
断开,不行成闭环,解决循环依赖
找到
getBean
有
2级缓存也没有,允许创建
3级缓存不为空 ,有A对象
创建A对象,b=null
true:allowEarlyReference局部变量,
不是工厂bean
添加到3级缓存得是getEarlyBeanReference返回得对象,要么是普通对象,要么是代理对象
获取A对象
不存在
如果返回不为空,并且,参数为空
第一次创建A对象走这里;第一次创建B对象走这里;
1级缓存是是否存在对象
第2次创建A对象,
再次从1级缓存中查找是否存在对象?
添加1级缓存,删除3级缓存,删除2级缓存,添加beanName到registeredSingletons
false,没有
还没有创建
preInstantiateSingletons
省略号内容
查询3级缓存有实例化好的对象
创建B对象,a=null
直接返回已有的对象
spring bean 大概流程
获取B对象
对象创建过程中,互相循环依赖的情况,形成闭环。为了解决这个情况,把其中某一环节断开即可A对象实例化后需要填充B属性,半成品A对象需要提前放入缓存, 实例化B对象,填充A属性,B对象创建完成, B对象已创建完,再完成A对象的创建
执行doGetBean,再从头走一遍流程
doCreateBean
是
打断点,结合源码看,不然会一脸懵
A对象调用getEarlyBeanReference,添加2级缓存,删除3级缓存
另外处理
查询1级缓存中没有实例化好得对象&&当前单例对象正在被创建中
没画完.
从beandefinetion获取到b属性,b属性得value值类型是RuntimeBeanReference
执行wrapIfNecessary返回一个代理对象
public class B { private A a; public B() { } public B(A a) { this.a = a; } public A getA() { return a; } public void setA(A a) { this.a = a; }}
执行 beanFactory.getBean(refName);类似递归执行开始得getBean方法
如果不是工厂bean
createBean
B对象创建后走这里
基本概念:DefaultSingletonBeanRegistry中的singletonObjects:1级缓存,存储:成品对象earlySingletonObjects:2级,存储:半成品对象singletonFactories:3级,存储:lambda表达式,
缓存中有A对象
1级缓存没有A对象,A对象正在创建
finishBeanFactoryInitialization
执行createBeanInstance,返回bean实例
getSingleton(beanName)
执行applyPropertyValues
查询2级缓存没有对象&&是否允许创建早期引用对象
没找到,创建并注册一个
if (mbd.isSingleton())判断是否是单例,此处默认单例,原型不在考虑之内
执行getObjectForBeanInstance
添加3级缓存,删除2级缓存,将单例beanName 添加到registeredSingletons集合
三级缓存 从getBean开始说起
0 条评论
下一页