循环依赖是指 Bean 对象循环引用,是两个或多个 Bean 之间相互持有对方的引用,例如 CircularDependencyA → CircularDependencyB → CircularDependencyA。
spring设计了三级缓存来解决循环依赖的问题
三级缓存如何解决呢,其实二级缓存就能解决一般的循环依赖但是无法解决AOP的代理的循环依赖。启动项目,IOC容器会将所有要创建的Bean加到一个List中,等待创建,比如先加载到的A,就会先去单例池中getBean("A"),发现单例池中没有,就会去半成品池中也就是二级缓存和三级缓存中找,都找不到的话,就会创建Bean的实例,createBeanInstance("A"),然后填充属性populateBean("A"),发现依赖于B,所以要去三级缓存中getBean("B"),找不到,所以也要创建Bean的实例,也就是createBean,然后添加属性,又要依赖A,所以就造成了循环依赖。三级缓存就是,在createBeanInstance("A"),之后,创建一个ObjectFactory("A"),放在三级缓存中也就是工厂池中,在这里如果有其他的Bean要提前引用的话,可以通过工厂创建代理对象,也可以创建半成品,放在二级缓存中,所以就很好的解决了AOP情况下的循环依赖。