@Service public class TestService1 { @Autowired private TestService2 testService2; public void test1() { } } @Service public class TestService2 { @Autowired private TestService1 testService1; public void test2() { } }
我们看到这里面出现了循环依赖问题。
spring内部有三级缓存:
- singletonObjects 一级缓存,用于保存实例化、注入、初始化完成的bean实例
- earlySingletonObjects 二级缓存,用于保存实例化完成的bean实例
- singletonFactories 三级缓存,用于保存bean创建工厂,以便于后面扩展有机会创建代理对象。
Spring的三级缓存对于循环依赖问题有很好的帮助,
一级保存实例化、注入完成、初始化的实例
二级只保存实例化的实例
三级只保存bean创建工厂。
t1实例化,将自己添加进三级缓存,注入阶段在一级缓存找不到t2,则实例化t2,t2放进三级缓存,将t1从三级缓存拿出来注入,
并把自己t2添加到二级缓存,t2初始化完成,放进一级缓存,t1从一级缓存拿出t2完成初始化,并添加进一级缓存。