5.5 Spring - 循环依赖解决 - 重绘
2021-04-09 22:51:25 0 举报
Spring发生循环依赖时的缓存状态变化
作者其他创作
大纲/内容
【part1】
OF = createBean()
一级缓存Map -> singletonObjects
二级缓存Map -> earlySingletonObjects
a2
return A.a
populateBean
rem
缓存状态发生变化 - 2
三级缓存Map -> singletonFactoriesOF2
假设A依赖A基于AnnotationConfigApplicationContext
OF.getObject()
invoke
getEarlyBeanReference(\"a\
a1
回到 a1
A : a1
sharedObj - A.a
get
createBean(a ...)
put
put obj
remove
A.a为先前反射创建出未加工的原始对象
缓存状态发生变化 - 1
singletonsCurrentlyInCreation = true
三级缓存Map -> singletonFactories
AbstractBeanFactory
doCreateBean(a ...)
【part2】
OF2 = getEarlyBeanReference()
假设循环链路上有 A->A->A->A 多次循环依赖 1. A第一次初始化时,将getEarlyBeanReference对象工厂放入三级缓存中; 2. 发生循环依赖,第二次从Bean工厂获取A时,通过getEarlyBeanReference对象工厂获取对象,并将该共享对象放入二级缓存中; 3. 后续再次发生循环依赖,第N次从Bean工厂获取A时,直接获取二级缓存中存储的共享对象。 4. 回到第一次初始化A,完成Bean的初始化,初始化完成后将完整对象放入一级缓存
allowEarlyReference = false
OF2.getObject() -> obj
OF2 = getEarlyBeanReference()
falsesingletonsCurrentlyInCreation
反射创建出未加工的原始对象
allowEarlyReference = true
getSingleton(a) -> null
createBeanInstance -> A.a
A.a
OF2
doGetBean
getSingleton(a)方法
initializeBean
get OF2
A : a2
缓存状态发生变化 - 3
总结
0 条评论
回复 删除
下一页