spring循環依賴為什么要三級緩存


先記想法后續補充
要理解為啥要三級緩存,我們先假設二級緩存能不能完成功能。
只用兩級緩存可以解決循環依賴問題,但僅僅限於沒有代理的情況。

一旦涉及到代理,就有個流程順序問題了。
常規getbean操作流程是先實例化-放入三級緩存一個factorybean-注入-執行初始化方法(其中執行了beanpostprocessor,這個過程可以修改bean,包括修改類型等等)-生成代理-存到一級緩存-刪除三級緩存。

這個時候如果只有兩級緩存那么意味着為了解決循環依賴問題時必須在二級緩存中就放入A的代理類,而不是factorybean。這樣才能在A注入B時,B直接注入A的代理類。
這時流程就變成了實例化-生成代理-放入二級緩存-注入-執行初始化方法(其中執行了beanpostprocessor,這個過程可以修改bean,包括修改類型等等)-存到一級緩存-刪除二級緩存。
這個時候流程就出現了問題,因為生成代理后續的操作均需要A目標類完成,比如注入,執行初始化方法等,特別是beanpostprocessor甚至還可能修改A目標,這樣之前生成的代理就是無用功,違背了bean創建流程。

總結下,三級緩存設計不能光看循環依賴這種場景,要結合普通創建場景來看,絕大部分場景是沒有循環依賴的,所以是需要將代理放到最后來實現的,只是為了解決循環依賴這種特殊情況才不得不把代理類提前生成,而又要兼顧普通場景,所以要三級緩存來解決。
所以像循環依賴這種場景,如果beanpostprocessor中替換了Abean成Cbean,B中注入的是Abean,那么是會報錯的,因為上下文AbeanName存在了2個實例,一個A一個C。假設不是循環依賴則不會報錯,而是將C放入上下文。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM