您好,登錄后才能下訂單哦!
這篇文章主要講解了“spring要怎么解決循環依賴”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“spring要怎么解決循環依賴”吧!
先說結論,spring通過三級緩存機制來解決循環依賴問題,構造器依賴除外,即構造器注入可能會報錯。
循環依賴的情況如下:
首先spring初始化bean的步驟如下:
這里只需要簡單的理解為只需要三步:
實例化
填充屬性(注入依賴)
初始化完成
spring在創建Bean A的時候會先去一級緩存(singletonObjects),如果一級緩存沒有則再從二級緩存(earlySingletonObjects)中獲取,如果二級緩存也沒有,則再從三級緩存(singletonFactories)中獲取,如果還獲取不到,則實例化一個A,然后放入三級緩存,然后填充屬性,此刻發現依賴B,于是創建B,同樣的經過上述步驟,由于每級緩存都獲取不到,于是實例化B,然后填充屬性,發現依賴A,然后依次去每級緩存中獲取,由于三級緩存中已經有一個A,于是B可以順利注入依賴,并被正確的初始化,然后遞歸返回,于是A也可以被正確的初始化了。
通過上述說明,可以看出bean都是需要可以先被實例化才可以的,所以這也就是為什么構造器依賴可能會失敗的原因。假如A構造器依賴B,因為實例化A需要先調用A的構造函數,發現依賴B,那么需要去初始化B,但是B也依賴A,不管B是通過構造器注入還是setter注入,此時由于A沒有被實例化,沒有放入三級緩存,所以B無法被初始化,所以spring會直接報錯。反之,如果A通過setter注入的話,那么則可以通過構造函數先實例化,放入緩存,然后再填充屬性,這樣的話不管B是通過setter還是構造器注入A,都能在緩存中獲取到,于是可以初始化。
由此可見,循環依賴中,如果spring先去創建的bean通過構造器注入另一個bean則會失敗,反之則可以成功。所以這也是為什么一定不好通過構造器注入的原因。
感謝各位的閱讀,以上就是“spring要怎么解決循環依賴”的內容了,經過本文的學習后,相信大家對spring要怎么解決循環依賴這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。