Spring的三級(jí)緩存解決循環(huán)依賴(lài)問(wèn)題
一、什么是Spring三級(jí)緩存

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

