1.回圈依賴的產生

在spring中物件默認都是單例的 ,意味整個容器中只有一個該類的物件,
如圖,B類有一個屬性a,A類有一個屬性b,當B類創建物件時,要給a屬性賦值;當A類創建物件時,要給b屬性賦值,從而產生回圈依賴,只要打破當前的倍訓,回圈依賴就不存在了,
回圈依賴產生的根本就是屬性賦值,
屬性復值的方式有兩種:
- 構造器賦值(回圈依賴的問題是無法解決的)
- set方法(通過三級快取來解決)
2.回圈依賴的解決
打破當前的倍訓,使用三級快取(三個map集合)解決

半成品: 完成實體化但未完成初始化
成品:完整物件
3.三級快取問題決議

3.1三級快取中分別保存的是什么物件
1:成品物件
2:半成品物件
3:lambda運算式
3.2如果只使用1級快取行不行?
不行,因為成品和半成品物件會放到起,在進行物件獲取的時候有可能獲取到半成品物件,這樣的物件是沒法使用的
3.3如果只有二級快取行不行?
getSingleton
doCreateBean
只有二級快取的時候也可以解決回圈依賴的問題,
添加aop的實作之后,報錯,This means that said other beans do not use the final version of the bean.沒有使用最終版本的bean物件
3.4 三級快取存在到底做了什么事?
如果一個物件需要被代理,生成代理物件,那么這個物件需要預先生成非代理物件嗎?
需要
3.5三級快取到底做了什么?
lambda getEarlyBeanReference().只要搞清楚這個方法的具體執行邏輯即可
在當前方法中,有可能會用代理物件替換非代理物件,如果沒有三級快取的話,那么就無法得到代理物件,換句話說
在整個容器中,包含了同名物件的代理物件和非代理物件,你覺得可以嗎?
容器中,物件都是單例的,意味著根據名稱只能獲取一個物件的值, 此時同時存在兩個物件的話,使用的時候應該取哪一個? 無法判斷
誰也無法確認什么時候會呼叫當前物件,是在其他物件的執行程序中來進行呼叫的,而不是人為指定的,所以必須要保證容器中任何時候都只
個物件供外部呼叫,所以在三級快取中,完整了一件代理物件替換非代理物件的作業, 確定回傳的是唯一的物件
三級快取是為了解決在aop代理程序中產生的回圈依賴問題,如果沒有aop的話,二級快取足矣解決回圈依賴問題
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/397134.html
標籤:Java
