Spring 循环依赖
2021-09-08 03:47:27 0 举报
spring 循环依赖流程图
作者其他创作
大纲/内容
resolveCandidate
案例:Spring 创建 X、Y 两个 bean,X、Y 相互之间依赖注入,流程图如下
getBean(y)
populateBean(y)
Spring 循环依赖流程图
getSingleton(y)
beanFactory.getBean(beanName)
doResolveDependency
由于此时 Y bean还未创建,所以返回 null
beforeSingletonCreation(x)
doCreateBean(x)
value = x (bean 对象,此时 x 还未完成 y 属性的注入)
createBean(x)
将 bean 存放到一级缓存,同时清除二级缓存而三级缓存中的当前的这个bean
创建 X Bean 对象,下半部分
doGetBean(x)
创建 X Bean 对象,上半部分,未注入 y 的依赖
getBean(x)
完成 X bean 的初始化工作
createBean(y)
addSingletonFactory( y,ObjectFactory<?>)
返回需要注入的 Y Bean 对象
doGetBean(y)
addSingletonFactory( x,ObjectFactory<?>)
返回需要注入的 X Bean 对象
value = beanFactory.resolveDependency(...)
return x
afterSingletonCreation(y);
getSingleton(x)
value = y (bean 对象,此时 y 已经完成 x 属性的注入)
这个是从二级缓存池取出未完成依赖注入的 X Bean,但已完成了 AOP 代理
将创建出来的bean放进 singletoFactory
afterSingletonCreation(x);
完成 X Bean 对象中 y 属性的依赖注入
是个重载方法,实际上是开始创建
doCreateBean(y)
创建 Y Bean对象
开始进行属性注入
populateBean(x)
第一次这里从singletonObjects 中拿到的是null,第二次才能取出值,循环依赖情况下取到的是一个未完成依赖注入的bean
完成 Y bean 的初始化工作
return y
将 beanName 添加到 singletonsCurrentlyInCreation Set 集合中,表示该 Bean实例 正在被创建
在这里创建完成后把 beanName 从 singletonsCurrentlyInCreation 集合中移除
beforeSingletonCreation(y)
0 条评论
下一页