在 Spring 框架中,循环依赖问题(Circular Dependency)是指多个 Bean 之间存在互相依赖的情况。Spring 容器通过一些机制来解决循环依赖问题,以确保应用程序的正常启动和运行。
1. 什么是循环依赖?
循环依赖是指两个或多个 Bean 之间存在互相依赖的关系。例如,Bean A 依赖于 Bean B,Bean B 又依赖于 Bean A。
举例:
java复制代码
public class A { private B b; public void setB(B b) { this.b = b; } } public class B { private A a; public void setA(A a) { this.a = a; } }
2. Spring 如何解决循环依赖?
Spring 通过 三级缓存 的机制来解决循环依赖问题。三级缓存包括:
- 一级缓存:已经完成实例化和初始化的单例 Bean 缓存(
singletonObjects
)。 - 二级缓存:正在创建中的 Bean 实例缓存(
earlySingletonObjects
)。 - 三级缓存:正在创建中的 Bean 工厂缓存(
singletonFactories
)。
三级缓存的工作原理:
- 一级缓存(singletonObjects)