傻子學編程系列之Spring如何解決Bean循環依賴

結論是:通過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的注入,自然是完成不了上述過程!

有問題可以留言,隨時回覆,哪裏寫的不好,歡迎指出!

發生雪崩時 沒有一片雪花是無辜的!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章