前提知識
1、解決循環依賴的核心依據:執行個體化和初始化步驟是分開執行的
2、實作方式:三級緩存
3、lambda表達式的延遲執行特性
spring源碼執行邏輯

核心方法refresh(), populateBean()填充bean對象,設定屬性值;
getEarlyBeanReference() 在未完成屬性指派之前,提前暴露代理對象,在指派的時候才确定真實對象。
1、三個map結構分别存儲什麼類型的對象?
-級緩存:成品對象
級緩存:半成品對象
三級緩存:lambda表達式
2、三個map結構在進行對象查找的時候,查找的順序是什麼樣的?
1, 2, 3
3、為什麼一級緩存有對象之後就要把二級和三級給移除掉?
因為對象的查找順序是1,2,3,如果在一級中找到了,那麼二級永遠也不會進行查找,以此類推
4、如果隻有一個map結構,能否解決循環依賴問題?
原則上是可以的,但是操作起來比較麻煩,當隻有一個map結構的時候就意味着成品對象和半成品對象要放到一起,而半成品對象是不能暴露給外部使用的,要不會報空指針異常,是以需要添加辨別位,而容器中對象的名字都是固定的,是以辨別位隻能在value中,也就意味着每次在判斷的時候都要擷取到value然後判斷完标志位之後才能進行下一步操作,比較麻煩,直接用兩個map可以輕松解決這個問題
5、如果隻有兩個map結構,能否解決循環依賴問題?
原則上是可以的,但是有前提條件:整個代碼的執行邏輯中不能包含代理對象的建立,否則會報錯
6、為什麼必須要使用三個map結構來解決循環依賴問題?三級緩存是如何解決循環依賴問題的?
(1)在建立代理對象的時候是否需要建立原始對象?
需要
(2)容器中能否同時存在兩個同名的不同對象?
不能
(3)如果建立出了代理對象,那麼原始對象應該怎麼處理?
當建立出代理對象之後,需要将代理對象覆寫原始對象