Spring三級緩存


一、什么是Spring三級緩存

第一級緩存:也叫單例池,存放已經經歷了完整生命周期的Bean對象。

第二級緩存:存放早期暴露出來的Bean對象,實例化以后,就把對象放到這個Map中。(Bean可能只經過實例化,屬性還未填充)。

第三級緩存:存放早期暴露的Bean的工廠。

注:

只有單例的bean會通過三級緩存提前暴露來解決循環依賴的問題,而非單例的bean,每次從容器中獲取都是一個新的對象,都會重新創建,所以非單例的bean是沒有緩存的,不會將其放到三級緩存中。

為了解決第二級緩存中AOP生成新對象的問題,Spring就提前AOP,比如在加載b的流程中,如果發送了循環依賴,b依賴了a,就要對a執行AOP,提前獲取增強以后的a對象,這樣b對象依賴的a對象就是增強以后的a了。

二三級緩存就是為了解決循環依賴,且之所以是二三級緩存而不是二級緩存,主要是可以解決循環依賴對象需要提前被aop代理,以及如果沒有循環依賴,早期的bean也不會真正暴露,不用提前執行代理過程,也不用重復執行代理過程。

 二、對象在三級緩存中的創建流程

A依賴B,B依賴A

1、A創建過程中需要B,於是先將A放到三級緩存,去實例化B。

2、B實例化的過程中發現需要A,於是B先查一級緩存尋找A,如果沒有,再查二級緩存,如果還沒有,再查三級緩存,找到了A,然后把三級緩存里面的這個A放到二級緩存里面,並刪除三級緩存里面的A。

3、B順利初始化完畢,將自己放到一級緩存里面(此時B里面的A依然是創建中的狀態)。然后回來接着創建A,此時B已經創建結束,可以直接從一級緩存里面拿到B,去完成A的創建,並將A放到一級緩存。


免責聲明!

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



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