一、什麼是循環依賴?
循環依賴就是多個對互相引用。比如說 class A 包含class B的引用,class B 裡面又包含 class 的引用。
class A {
B b;
}
class B {
A a;
}
二、循環依賴的類别
1、構造器循環依賴(此依賴問題無法解決,會發生棧溢出)
2、set循環依賴(隻能解決單例循環依賴問題)
三、set循環依賴的解決辦法
class A {
B b;
public B getB() {
return b;
}
public void setB(B b) {
this.b = b;
}
}
--------------------------------------
class B {
A a;
public A getA() {
return a;
}
public void setA(A a) {
this.a = a;
}
}
1、ico容器首先利用class 的構造器建立一個單例的a對象,并将其加入到“目前建立對象池中”,并通過一個工廠方法,讓其他對象能拿到a對象的引用。
2、建立a對象後,然後進行屬性注入b。由于b還未建立,是以先調用B 的空構造器建立b對象。同樣的 加入其加入到“目前建立對象池中”,并通過一個工廠方法,讓其他對象能拿到b對象的引用。
3、b對象進行屬性注入時,發現a對象已經存在于“對象建立池中”,是以直接注入a。
4、第四步,這時a對象才去注入b對象。
-------------------------------------------------------
本人才疏學淺,以上純屬個人了解,如有不對,還望批評指正。