在Spring框架中,循環(huán)依賴是指兩個(gè)或多個(gè)Bean互相依賴,其中一個(gè)Bean依賴另一個(gè)Bean,而另一個(gè)Bean又依賴第一個(gè)Bean,形成一個(gè)循環(huán)依賴關(guān)系。當(dāng)使用getBean
方法獲取一個(gè)循環(huán)依賴的Bean時(shí),Spring容器會(huì)拋出BeanCurrentlyInCreationException
異常,因?yàn)樗鼰o(wú)法在循環(huán)依賴的情況下完成Bean的創(chuàng)建。
為了解決循環(huán)依賴問(wèn)題,Spring框架提供了三種解決方案:
@Lazy
注解:通過(guò)在Bean的依賴注入處使用@Lazy
注解,可以延遲加載Bean的創(chuàng)建,從而解決循環(huán)依賴問(wèn)題。@Component
public class A {
private B b;
@Autowired
@Lazy
public void setB(B b) {
this.b = b;
}
}
@Component
public class B {
private A a;
@Autowired
public void setA(A a) {
this.a = a;
}
}
@DependsOn
注解:通過(guò)在Bean的定義處使用@DependsOn
注解,可以指定Bean的創(chuàng)建順序,從而解決循環(huán)依賴問(wèn)題。@Component
@DependsOn("b")
public class A {
private B b;
@Autowired
public void setB(B b) {
this.b = b;
}
}
@Component
@DependsOn("a")
public class B {
private A a;
@Autowired
public void setA(A a) {
this.a = a;
}
}
@Component
public class A {
private B b;
@Autowired
public A(B b) {
this.b = b;
}
}
@Component
public class B {
private A a;
@Autowired
public B(A a) {
this.a = a;
}
}
通過(guò)以上三種解決方案,可以有效地解決循環(huán)依賴問(wèn)題,并確保Bean的正確創(chuàng)建和注入。