spirng循环依赖
1.循环依赖就是循环引用,就是两个或多个bean相互之间的持有对方,比如CircleA引用CircleB,Circle引用CircleC,CircleC引用CircleA,则它们最终反映了一个环。
此处不是循环调用,循环调用是方法之间的循环调用。循环调用是无法解决的,除非有终结条件,否则就是死循环,最终导致内存溢出错误。
2.spring解决循环依赖。
spring有两种循环依赖:构造器循环依赖和setter循环依赖。
循环引用类定义:
public class TestA {
private TestB testB;
public void a() {
testB.b();
}
public TestB getTestB() {
return testB;
}
public void setTestB(TestB testB) {
this.testB = testB;
}
}
public class TestB {
private TestC testC;
public void b() {
testC.c();
}
public TestC getTestC() {
return testC;
}
public void setTestC(TestC testC) {
this.testC = testC;
}
}
public class TestC {
private TestA testA;
public void c(){
testA.a();
}
public TestA getTestA() {
return testA;
}
public void setTestA(TestA testA) {
this.testA = testA;
}
}
(1)、构造器循环依赖
表示通过构造器注入构成的循环依赖,此依赖是无法解决的,只能抛出BeanCurrentlyInCreationException异常表示循环依赖。
spring容器将每一个正在创建的bean标识符放在一个“当前创建bean池”中,bean标识符在创建过程中将一直保持在这个池中,因此如果在创建bean的过程中发现自己已经在“当前创建bean池”里,将抛出BeanCurrentlyInCreationException异常表示循环依赖,
当前创建的bean在池中删除。
(2)、setter循环依赖
表示通过setter注入方式构成的循环依赖。对于setter注入造成的依赖是通过spring容器提前暴露刚完成构造器注入但未完成其他步骤(如setter注入)的bean来完成的,而且只能解决单例作用域的bean循环依赖。通过提前暴露一个单例工厂,从而使其他bean能
引用到该bean。