1.Spring循环依赖
循环依赖又叫循环引用,及两个对象之间相互持有,形成一个闭环.
代码示例:
public class A { private A a; }
public class B { private B b; }
2.解决方法
1.通过三级缓存解决
一级缓存(singletonObjects):存放完成实例化和初始化的对象
二级缓存(earlySingletonObjects):存放实例化但未初始化的对象
三级缓存(singletonFactories):存放可以生成bean的工厂
2.具体实现
2.1 创建A对象,创建A对象之前先从一级缓存中通过getSingletonObjects()方法获取对象A,如果获取不到,再次调用该方法,再获取不到,就通过getSingletonFactories()方法从三级缓存中获取,如果没有获取到,就调用doCreateBean()方法创建A对象,在A对象实例化完成后,调用populateSet()方法为B进行初始化的时候,容器中并不存在B,此时调用addSingletonObjects()方法将A对象放入三级缓存中
2.2 创建B对象,创建B对象之前先从一级缓存中通过getSingletonObjects()方法获取对象B,如果获取不到,再次调用该方法,再获取不到,就通过getSingletonFactories()方法从三级缓存中获取,如果没有获取到,就调用doCreateBean()方法创建B对象,通过populateSet()方法为A进行初始化,此时从三级缓存中获取到A完成A的初始化并将A放入二级缓存,B创建完成后调用addSingletonObjects()方法将自己放入一级缓存中
2.3 完成A对象的创建,A对象从一级缓存中拿到B对象完成B的初始化并将自己放入到一级缓存中