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。

原文地址:https://www.cnblogs.com/sun-sun/p/10521334.html