什么是循环依赖
说白是一个或多个对象实例之间存在直接或间接的依赖关系,这种依赖关系构成了构成一个环形调用。
自己依赖自己
两个对象间的依赖关系
多个对象间的依赖关系
Spring出现循环依赖的场景
单例的setter注入
@Service
public class A {
@Resource
private B b;
public void test1(){
}
}
@Service
public class B {
@Resource
private A a;
public void test2(){
}
}
这是一个典型的循环依赖问题,但是Spring已经帮我们解决了,所以我们无法察觉到问题
Spring内部有三级缓存:
一级缓存:singletonObjects,用于保存实例化、初始化完成的bean
一级缓存作用:限制bean在beanFactory中只存一份,即实现singleton scope,解决不了循环依赖
如果要想打破循环依赖, 就需要一个中间人的参与, 这个中间人就是二级缓存。
二级缓存:earlySingletonObjects,用于保存实例化完成的bean实例
三级缓存:singletonObjects,用于保存bean的创建工厂,以便于后面有机会创建代理对象
Spring三级缓存间的关系
构造方法出现了循环依赖怎么解决?
原因:由于bean的生命周期中构造函数是第一个执行的,spring框架并不能解决构造函数的的依赖注入
可以通过@Lazy注解解决,什么时候需要对象再进行bean对象的创建
public A(@Lazy B b){
System.out.println("A的构造方法执行了...");
this.b = b ;
}