循环依赖的问题其实是两个或多个 Bean 相互依赖,形成一个闭环。
spring通过三级缓存解决循环依赖,第一级缓存是单例池,二级缓存存放创建出来但还没有初始化的对象,对象创建的中间状态,对象初始化的时候,如果在一级缓存没有找到,就会到二级缓存找。通过先加载一个没有初始化的对象的方式,让初始化方法不会同时进行。
spring除了正常的对象还有动态代理对象,动态代理对象的中间状态存放在第三级缓存。
spring无法解决通过构造函数循环依赖的问题,可以用@Lazy,使构造函数不同时进行来解决。