天天看點

Spring三級緩存解決循環依賴

前提知識

1、解決循環依賴的核心依據:執行個體化和初始化步驟是分開執行的

2、實作方式:三級緩存

3、lambda表達式的延遲執行特性

spring源碼執行邏輯

Spring三級緩存解決循環依賴

核心方法refresh(), populateBean()填充bean對象,設定屬性值;

getEarlyBeanReference() 在未完成屬性指派之前,提前暴露代理對象,在指派的時候才确定真實對象。

Spring三級緩存解決循環依賴

1、三個map結構分别存儲什麼類型的對象?

Spring三級緩存解決循環依賴

-級緩存:成品對象

級緩存:半成品對象

三級緩存:lambda表達式

2、三個map結構在進行對象查找的時候,查找的順序是什麼樣的?

1, 2, 3

3、為什麼一級緩存有對象之後就要把二級和三級給移除掉?

Spring三級緩存解決循環依賴

因為對象的查找順序是1,2,3,如果在一級中找到了,那麼二級永遠也不會進行查找,以此類推

4、如果隻有一個map結構,能否解決循環依賴問題?

原則上是可以的,但是操作起來比較麻煩,當隻有一個map結構的時候就意味着成品對象和半成品對象要放到一起,而半成品對象是不能暴露給外部使用的,要不會報空指針異常,是以需要添加辨別位,而容器中對象的名字都是固定的,是以辨別位隻能在value中,也就意味着每次在判斷的時候都要擷取到value然後判斷完标志位之後才能進行下一步操作,比較麻煩,直接用兩個map可以輕松解決這個問題

5、如果隻有兩個map結構,能否解決循環依賴問題?

原則上是可以的,但是有前提條件:整個代碼的執行邏輯中不能包含代理對象的建立,否則會報錯

6、為什麼必須要使用三個map結構來解決循環依賴問題?三級緩存是如何解決循環依賴問題的?

(1)在建立代理對象的時候是否需要建立原始對象?

需要

(2)容器中能否同時存在兩個同名的不同對象?

不能

(3)如果建立出了代理對象,那麼原始對象應該怎麼處理?

當建立出代理對象之後,需要将代理對象覆寫原始對象