天天看點

Spring IOC 循環依賴

一、什麼是循環依賴?

循環依賴就是多個對互相引用。比如說 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對象。

-------------------------------------------------------

本人才疏學淺,以上純屬個人了解,如有不對,還望批評指正。