Spring中的循环引用
在创建A时需要B,创建B时需要A
三级缓存解决循环依赖问题
在Spring中定义了一个类
DefaultSingletonBeanRegistry
中定义了三个map
singletonObjects 一级缓存
单例池,存放完整初始化的bean对象
earlySingletonObjects 二级缓存
缓存早期的bean对象(执行构造函数还没执行其他周期的bean)
singletonFactories 三级缓存
缓存ObjectFactory,对象工厂,用于创建bean
如果bean是多例的,那么只有需要bean时才会创建bean
循环依赖的解决过程
二级缓存可以解决一般对象的循环依赖
但是如果是代理对象需要三级缓存解决
每次需要注入时
在三级缓存中放入一个对应的对象工厂
从对象工厂中创建代理对象注入二级缓存
再从二级缓存获取代理对象进行依赖注入
构造方法循环依赖无法自动解决
通过在需要引用的对象前面加一个@lazy实现懒加载
public A(@lazy B b){
....
}