Spring中的循环依赖是通过三级缓存来实现的,原因如下:
1. 第一级缓存是singletonObjects,它用来存储已经创建好的单例bean实例。当一个bean实例创建成功后,会放入这个缓存中。
2. 第二级缓存是earlySingletonObjects,它用来存储在创建bean实例过程中,已经完成完整生命周期的bean实例对象。这些对象可能存在部分依赖的属性未注入。
3. 第三级缓存是singletonFactories,它用来存储正在创建或已经创建的Bean实例的工厂对象,即ObjectFactory。当bean之间相互依赖时,Spring会在第二级缓存中查找是否有完整的Bean实例对象,如果没有,则从该缓存中获取Bean工厂实例对象,再用该工厂对象完成Bean的创建。
综上所述,Spring循环依赖采取三级缓存的实现方式,是为了解决bean之间相互依赖时,初始化的顺序问题。通过三级缓存的方式,可以提前创建对象并缓存起来,以便在相互依赖时进行引用,从而完成循环依赖。