結論是:通過setter方法(@AutoWired)注入bean可以被解決,通過構造器方法注入bean直接拋出異常!
不知道什麼是構造器注入的,先去學習一波!
下面看一下Spring是怎麼解決循環依賴的:
先明白兩點:
1.bean的創建過程簡單分爲 實例化=》填充數據=》初始化
2.創建bean的過程有三級緩存(類似於)
一級緩存:singletonObjects(存放的初始化完成的單例bean)
二級緩存:earlySingletonObject(存放正在創建的bean)
三級緩存:singletonFactories(只這裏有的,可以直接獲得bean的對象)
準備條件:現在有兩個Ban,A和B,A裏邊注入B,B裏面注入A,ok形成循環依賴。
解釋創建過程:1.A對象實例化,然後把自己放入三級緩存中。
2.A對象填充數據,也就是注入B,去一級,二級,三級緩存都沒有找到。
3.都沒有找到,然後A對象繼續等待,開始創建B對象。
4.B對象實例化,把自己放入三級緩存。
5.B對象填充數據,也就是注入A,去一級緩存找,肯定沒有,因爲只有初始化完成纔會放進一級緩存。
6.去二級緩存找,也是沒找到,去三級緩存找,找到了A對象,雖然是沒創建完成的。這裏有個細節就是把A對象從三級緩存中刪除,放到二級對象裏邊,什麼原因,我就不詳細說了。
7.B對象順利完成初始化,返回給A,類似遞歸的返回值一樣。
8.然後A對象順利完成。
回到上邊結論,爲什麼構造器方法不可以解決循環依賴,因爲剛纔過程是依賴於對象先實例化,再填充Bean,構造器注入會在實例化的過程就要Bean的注入,自然是完成不了上述過程!
有問題可以留言,隨時回覆,哪裏寫的不好,歡迎指出!
發生雪崩時 沒有一片雪花是無辜的!