spring循环依赖问题
- bean创建的整体流程在此不表。只摘录部分代码及流程
循环依赖问题主要主要
ConfigurableListableBeanFactory
中对单例bean的预加载中解决。ConfigurableListableBeanFactory
中提供bean definition
的解析,注册,对单例的预加载.
- 以上可知,其实spring只解决了单例bean的循环依赖,其他的,spring也没办法,抛异常
循环依赖问题的产生
- Bean互相依赖
- 构造器互相依赖
- 属性互相依赖
….
spring中的解决方案
创建与初始化完毕分割开,增加多级缓存处理
- A依赖B,A先创建,并将自己放在缓存中
- B开始创建,发现依赖C,处理同1
- C开始创建,发现依赖A,可以引用早期A的缓存,然后继续初始化。完毕之后将自己添加到一级缓存中。
各级缓存的值及设置
三级缓存
1 | protected <T> T doGetBean(final String name, final Class<T> requiredType, |
- 关于
singletonObjects
、earlySingletonObjects
、singletonFactories
1 |
|
二级缓存
1 | // Eagerly cache singletons to be able to resolve circular references |
- 这段代码在
createBeanInstance(...)
方法之后,此时已经创建完毕(在堆中开辟了空间)
一级缓存
添加至一级缓存,同时从二级、三级缓存中删除。
1 | /** |
注意: 这个getSingleton和上边的getSingleton不同!
不得不说,处理的很是巧妙…..