Spring的三級緩存解決循環(huán)依賴問題
一、什么是Spring三級緩存

- 第一級緩存:也叫單例池,存放已經(jīng)經(jīng)歷了完整生命周期的Bean對象。
- 第二級緩存:存放早期暴露出來的Bean對象,實例化以后,就把對象放到這個Map中。(Bean可能只經(jīng)過實例化,屬性還未填充)。
- 第三級緩存:存放早期暴露的Bean的工廠。
注:
只有單例的bean會通過三級緩存提前暴露來解決循環(huán)依賴的問題,而非單例的bean,每次從容器中獲取都是一個新的對象,都會重新創(chuàng)建,所以非單例的bean是沒有緩存的,不會將其放到三級緩存中。
為了解決第二級緩存中AOP生成新對象的問題,Spring就提前AOP,比如在加載b的流程中,如果發(fā)送了循環(huán)依賴,b依賴了a,就要對a執(zhí)行AOP,提前獲取增強(qiáng)以后的a對象,這樣b對象依賴的a對象就是增強(qiáng)以后的a了。
二三級緩存就是為了解決循環(huán)依賴,且之所以是二三級緩存而不是二級緩存,主要是可以解決循環(huán)依賴對象需要提前被aop代理,以及如果沒有循環(huán)依賴,早期的bean也不會真正暴露,不用提前執(zhí)行代理過程,也不用重復(fù)執(zhí)行代理過程。
二、對象在三級緩存中的創(chuàng)建流程
A依賴B,B依賴A
1、A創(chuàng)建過程中需要B,于是先將A放到三級緩存,去實例化B。
2、B實例化的過程中發(fā)現(xiàn)需要A,于是B先查一級緩存尋找A,如果沒有,再查二級緩存,如果還沒有,再查三級緩存,找到了A,然后把三級緩存里面的這個A放到二級緩存里面,并刪除三級緩存里面的A。
3、B順利初始化完畢,將自己放到一級緩存里面(此時B里面的A依然是創(chuàng)建中的狀態(tài))。然后回來接著創(chuàng)建A,此時B已經(jīng)創(chuàng)建結(jié)束,可以直接從一級緩存里面拿到B,去完成A的創(chuàng)建,并將A放到一級緩存。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
全網(wǎng)最深分析SpringBoot MVC自動配置失效的原因
這篇文章主要介紹了全網(wǎng)最深分析SpringBoot MVC自動配置失效的原因,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
mybatis通過TypeHandler?list轉(zhuǎn)換string類型轉(zhuǎn)換方式
這篇文章主要介紹了mybatis通過TypeHandler?list轉(zhuǎn)換string類型轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
SpringBoot+Vue項目部署實現(xiàn)傳統(tǒng)方式
我們在進(jìn)行前后端分離開發(fā)的時候,一般是將前端項目部署到nginx服務(wù)器上,與后端項目分開部署,這篇文章主要給大家介紹了關(guān)于SpringBoot+Vue項目部署實現(xiàn)傳統(tǒng)方式的相關(guān)資料,需要的朋友可以參考下2024-01-01
springboot自動重連Redis的實現(xiàn)方法
由于網(wǎng)絡(luò)或服務(wù)器問題,Redis連接可能會斷開,導(dǎo)致應(yīng)用程序無法繼續(xù)正常工作,本文主要介紹了springboot自動重連Redis的實現(xiàn)方法,具有一定的參考價值,感興趣的可以了解一下2024-02-02
SpringBoot中yml多環(huán)境配置的3種方法
這篇文章主要給大家介紹了SpringBoot中yml多環(huán)境配置的3種方法,文中有詳細(xì)的代碼示例供大家參考,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-10-10
java sftp下載文件報錯Caused by:com.jcraft.jsch.JSchExcep
文章講述了作者在日常工作中遇到的JSch連接問題,經(jīng)過分析發(fā)現(xiàn)是由于連接泄露導(dǎo)致的,作者提出了解決方案,并給出了使用建議:1.在finally代碼塊中關(guān)閉連接;2.在真正使用階段再創(chuàng)建連接,避免創(chuàng)建后不使用又忘記關(guān)閉連接2024-11-11

