Spring循環(huán)依賴問題

什么是循環(huán)依賴

循環(huán)依賴就是兩個(gè)對(duì)象之間存在相互依賴的關(guān)系;

Spring是如何解決循環(huán)依賴的

Spring使用三級(jí)緩存來解決循環(huán)依賴

三級(jí)緩存如何解決循環(huán)依賴的

三級(jí)緩存是通過三個(gè)HashMap來實(shí)現(xiàn)的。

  • 一級(jí)緩存,用于保存已完成初始化的Bean實(shí)例,對(duì)外暴露可用的實(shí)例;
  • 二級(jí)緩存,保存尚未完成初始化的Bean實(shí)例,為了處理循環(huán)依賴的對(duì)象創(chuàng)建問題;
  • 三級(jí)緩存,保存創(chuàng)建Bean實(shí)例的工廠類,處理存在 AOP + 循環(huán)依賴的對(duì)象創(chuàng)建問題,能將代理對(duì)象提前創(chuàng)建。

三級(jí)緩存解決循環(huán)依賴過程

循環(huán)依賴

Spring 為什么要引入第三級(jí)緩存?

Spring 的設(shè)計(jì)原則是盡可能保證普通對(duì)象創(chuàng)建完成之后,再生成其 AOP 代理(盡可能延遲代理對(duì)象的生成)所以 Spring 用了第三級(jí)緩存,既維持了設(shè)計(jì)原則,又處理了循環(huán)依賴。

只用二級(jí)緩存能不能解決循環(huán)依賴?

可以,但是在AOP對(duì)象發(fā)生循環(huán)依賴的時(shí)候會(huì)存在一些問題。
一級(jí)和二級(jí)緩存
如果只用一級(jí)緩存和二級(jí)緩存時(shí),在給Bean實(shí)例注入依賴時(shí)只能注入原始對(duì)象,而非提前創(chuàng)建的代理對(duì)象。因?yàn)閷傩再x值階段完成之后,在Bean初始化階段才會(huì)生成代理對(duì)象。
一級(jí)和三級(jí)緩存
如果只用一級(jí)緩存和三級(jí)緩存時(shí),在每次獲取依賴Bean實(shí)例的時(shí)候,都會(huì)通過ObjectFactory創(chuàng)建新的實(shí)例,違背Spring設(shè)計(jì)原則。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容