Bootstrap

spring中解决循环依赖的方法

为了避免这种循环依赖问题,Spring 引入了三级缓存的机制,分为:

  1. 一级缓存singletonObjects):这是存放已经完全创建好的单例 Bean 的缓存。当 Bean 完全初始化并且可以被使用时,会存放在这里。

  2. 二级缓存earlySingletonObjects):这是一个存放 Bean 的“早期引用”的缓存。它保存的是那些已经实例化但是还没有完全初始化完成的 Bean(例如,还没有设置完所有依赖的 Bean)。这个缓存用于解决 Bean 依赖于自己的问题。

  3. 三级缓存singletonFactories):这是存放 ObjectFactory 的缓存,它实际上是一个工厂,用来生成 Bean 实例。当 Spring 创建 Bean 时,会先将一个 ObjectFactory 放入这个缓存中,这个工厂在被调用时会返回一个正在创建的 Bean 的实例。

注意,这里二级缓存中的早期引用,是解决循环依赖的关键。早期引用就是指一个 Bean 在刚被实例化,没初始化之前,Spring 会将它放入二级缓存中,以便其他 Bean 在需要的时候能够提前依赖它。

Spring 会将 AB 都放入一级缓存(singletonObjects),表示它们已经完全初始化,可以正常使用

;