深入理解Spring中的循環(huán)依賴
循環(huán)依賴
定義: 循環(huán)依賴就是循環(huán)引用,就是兩個或多個Bean相互之間的持有對方,比方CircularityA引用CircularityB,CircularityB引用CircularityC,CircularityC引用CircularityA。形成一個環(huán)狀引用關(guān)系。

在使用Spring時,如果主要采用基于構(gòu)造器的依賴注入方式,則可能會遇到循環(huán)依賴的情況,簡而言之就是Bean A的構(gòu)造器依賴于Bean B,Bean B的構(gòu)造器又依賴于Bean A。在這種情況下Spring會在編譯時拋出BeanCurrentlyInCreationException。
Class A
@Component
public class ClassA {
private ClassB classB;
@Autowired
public ClassA(ClassB classB) {
this.classB = classB;
}
public void printClass() {
System.out.println("Class A = " + this);
System.out.println("Class B = " + classB);
}
}
Class B
@Component
public class ClassB {
private ClassA classA;
@Autowired
public ClassB(ClassA classA) {
this.classA = classA;
}
public void printClass() {
System.out.println("Class A = " + classA);
System.out.println("Class B = " + this);
}
}
測試
@ContextConfiguration(classes = {ClassA.class, ClassB.class})
@RunWith(SpringRunner.class)
public class MyTest {
@Autowired
private ClassA classA;
@Autowired
private ClassB classB;
@Test
public void name() {
classA.printClass();
classB.printClass();
}
}
原因
這時候運(yùn)行測試就會發(fā)現(xiàn)拋出了BeanCurrentlyInCreationException異常。產(chǎn)生這種情況的原因是,Spring在創(chuàng)建Bean時,會首先實例化對象,然后再注入依賴。假設(shè)Spring首先創(chuàng)建Class A,那么就會發(fā)現(xiàn)在構(gòu)造器里有Class B的依賴,所以就會轉(zhuǎn)去創(chuàng)建Class B,又在Class B的構(gòu)造器里發(fā)現(xiàn)了對Class A的依賴,而此時Class A是還未初始化完的,因此又會轉(zhuǎn)去創(chuàng)建Class A,這樣就陷入了死循環(huán)。
解決方法
換成基于setter的依賴注入即可解決這個問題。因為基于setter的依賴注入會首先調(diào)用默認(rèn)構(gòu)造函數(shù)來實例化對象,然后再調(diào)用setter實現(xiàn)依賴注入。這樣在對象實例化的階段就沒有了任何依賴,因此Class A實例化完成后再調(diào)用Class B,Class B實例化完成后開始設(shè)值,而這時Class A已經(jīng)是實例化完成了的,所以可以成功引用到Class A。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Java+MyBatis+MySQL開發(fā)環(huán)境搭建流程詳解
Java的MyBatis框架提供了強(qiáng)大的數(shù)據(jù)庫操作支持,這里我們先在本地的開發(fā)環(huán)境中上手,來看一下Java+MyBatis+MySQL開發(fā)環(huán)境搭建流程詳2016-06-06
IntelliJ IDEA 2021.1 推出語音、視頻功能,邊寫代碼邊聊天(功能超級強(qiáng)大
這篇文章主要介紹了IntelliJ IDEA 2021.1 推出語音、視頻功能,邊寫代碼邊聊天(功能超級強(qiáng)大),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04

