首先抛出问题 什么是循环依赖 举个例子 有两个类A和B,其中A类包含一个B类实例,B类包含A类实例,不用测试都能猜到会报错。
在Spring项目中,很有可能发生这种相互依赖的情况,所以Spring对此有解决方案。
@Service public class TestService1 { @Autowired private TestService2 testService2; public void test1() { } } @Service public class TestService2 { @Autowired private TestService1 testService1; public void test2() { } }
这个典型的循环依赖在spring项目中可以正常运行。
spring内部有三级缓存:
- singletonObjects 一级缓存,用于保存实例化、注入、初始化完成的bean实例
- earlySingletonObjects 二级缓存,用于保存实例化完成的bean实例
- singletonFactories 三级缓存,用于保存bean创建工厂,以便于后面扩展有机会创建代理对象
其解决循环依赖如下图: