1、解決循環(huán)依賴的核心依據(jù):實(shí)例化和初始化步驟是分開執(zhí)行的
創(chuàng)新互聯(lián)建站于2013年開始,先為上海等服務(wù)建站,上海等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為上海企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
2、實(shí)現(xiàn)方式:三級(jí)緩存
3、lambda表達(dá)式的延遲執(zhí)行特性
核心方法refresh(),populateBean()填充bean對(duì)象,設(shè)置屬性值;
getEarlyBeanReference() 在未完成屬性賦值之前,提前暴露代理對(duì)象,在賦值的時(shí)候才確定真實(shí)對(duì)象。
1、三個(gè)map結(jié)構(gòu)分別存儲(chǔ)什么類型的對(duì)象?
-級(jí)緩存:成品對(duì)象
級(jí)緩存:半成品對(duì)象
三級(jí)緩存:lambda表達(dá)式
2、三個(gè)map結(jié)構(gòu)在進(jìn)行對(duì)象查找的時(shí)候,查找的順序是什么樣的?
1, 2, 3
3、為什么一級(jí)緩存有對(duì)象之后就要把二級(jí)和三級(jí)給移除掉?
因?yàn)閷?duì)象的查找順序是1,2,3,如果在一級(jí)中找到了,那么二級(jí)永遠(yuǎn)也不會(huì)進(jìn)行查找,以此類推
4、如果只有一個(gè)map結(jié)構(gòu),能否解決循環(huán)依賴問題?
原則上是可以的,但是操作起來(lái)比較麻煩,當(dāng)只有一個(gè)map結(jié)構(gòu)的時(shí)候就意味著成品對(duì)象和半成品對(duì)象要放到一起,而半成品對(duì)象是不能暴露給外部使用的,要不會(huì)報(bào)空指針異常,所以需要添加標(biāo)識(shí)位,而容器中對(duì)象的名字都是固定的,所以標(biāo)識(shí)位只能在value中,也就意味著每次在判斷的時(shí)候都要獲取到value然后判斷完標(biāo)志位之后才能進(jìn)行下一步操作,比較麻煩,直接用兩個(gè)map可以輕松解決這個(gè)問題
5、如果只有兩個(gè)map結(jié)構(gòu),能否解決循環(huán)依賴問題?
原則上是可以的,但是有前提條件:整個(gè)代碼的執(zhí)行邏輯中不能包含代理對(duì)象的創(chuàng)建,否則會(huì)報(bào)錯(cuò)
6、為什么必須要使用三個(gè)map結(jié)構(gòu)來(lái)解決循環(huán)依賴問題?三級(jí)緩存是如何解決循環(huán)依賴問題的?
(1)在創(chuàng)建代理對(duì)象的時(shí)候是否需要?jiǎng)?chuàng)建原始對(duì)象?
需要
(2)容器中能否同時(shí)存在兩個(gè)同名的不同對(duì)象?
不能
(3)如果創(chuàng)建出了代理對(duì)象,那么原始對(duì)象應(yīng)該怎么處理?
當(dāng)創(chuàng)建出代理對(duì)象之后,需要將代理對(duì)象覆蓋原始對(duì)象
(4)那么為什么要引入三級(jí)緩存呢?為什么要傳入一個(gè)lambda表達(dá)式呢?
正常的bean的生命周期是先通過createBeanlnstance創(chuàng)建出原始對(duì)象,然后在populateBean的方法中完成對(duì)象屬性的賦值工作,然后在BeanPostProcessor的后置處理方法中完成代理對(duì)象的創(chuàng)建工作,也就是說按照正常的執(zhí)行邏輯,是完成屬性的賦值之后才會(huì)創(chuàng)建出代理對(duì)象,那么意味著最后創(chuàng)建出的是代理對(duì)象,但是賦值的時(shí)候賦的是原始對(duì)象,所以會(huì)出現(xiàn)一個(gè)錯(cuò)誤:that said other beans do not use the final version of the bean.當(dāng)引入lambda表達(dá)式之后相當(dāng)于將生成代理對(duì)象的過程給提前了,也就是說在完成對(duì)象的屬性賦值的時(shí)候必須要唯一性的確定好我需要的到底是代理對(duì)象還是原始對(duì)象,參考 (getEarlyBeanReference方法)也就是說我們?cè)谫x值的前一刻必須要確定好最終的結(jié)果,但是又因?yàn)槲覀儧]有辦法確定什么時(shí)刻會(huì)給什么對(duì)象的屬性賦值,所以采用lambda表達(dá)式的方法延遲執(zhí)行,只有在對(duì)象賦值的最后一刻才確定出到底是什么對(duì)象。