在Spring框架中,循环依赖是一个常见的问题,它指的是两个或多个Bean之间互相依赖,形成一个闭环,导致无法准确地完成对象的创建和初始化。为了解决这个问题,Spring引入了三级缓存机制。以下是对Spring中循环依赖和三级缓存的详细解释:
一、循环依赖的定义与场景
循环依赖通常发生在以下场景:
- 直接循环依赖:两个Bean互相依赖,例如Bean A依赖于Bean B,同时Bean B也依赖于Bean A。
- 间接循环依赖:通过多个Bean形成一个依赖链,最终回到起点,形成一个闭环。
二、三级缓存的定义与作用
Spring的三级缓存主要由三个Map数据结构组成,分别用于存储不同状态的Bean:
- 一级缓存(singletonObjects):存储已经完全初始化和实例化的Bean对象。这个缓存的目的是确保Bean只初始化一次(是单例的),避免多次实例化相同的Bean对象,提高性能。
- 二级缓存(earlySingletonObjects):存储尚未完成属性注入和初始化的“半成品”Bean对象。当Spring容器发现两个或多个Bean之间存在循环依赖时,会将这些未完全初始化的对象提前暴露在二级缓存中,以便其他Bean进行引用,确保它们之间的依赖能够被满足。
- 三级缓存(singletonFactories):存储ObjectFactory类型的代理工厂对象。主要用于处理存在AOP(面向切面编程)时的循环依赖问题。每个Bean都对应一个ObjectFactory对象,通过调用该对象的getObject方法,可以获取到早期暴露出去的Bean。
在 DefaultSingletonBeanRegistry中定义的这三个map
//一级缓存
private final Map<Stri