Spring迴圈依賴原始碼Debug

2021-10-14 12:31:27 字數 1178 閱讀 6296

首先我們要搞清楚兩個概念:例項化/初始化

例項化:堆記憶體中申請一塊記憶體空間,類似租賃好房子,自己的家具東西還沒有搬家進去

初始化屬性填充:完成屬性的各種賦值,類似裝修、家電家具進場

**快取+四大方法

①**快取:

第一層singletonobjects存放的是已經初始化好了的bean。

第二層earlysingletonobjects存放的是例項化了,但是未初始化的bean

第三層singletonfactories存放的是factorybean。假如a類實現factorybean,那麼依賴注入的時候不是a類,而是a類產生的bean

②四大方法:

1.getsingleton:希望從容器裡面獲得單例的bean,沒有的話 就去建立

2.docreatebean: 沒有就建立bean

3.populatebean: 建立完了以後,要填充屬性

4.addsingleton: 填充完了以後,再新增到容器進行使用

a建立過程中需要b,於是a將自己放到**快取裡面,去例項化b

b例項化的時候發現需要a,於是b先查一級快取,沒有,再查二級快取,還是沒有,再查**快取,找到了a

然後把**快取裡面的這個a放到二級快取裡面,並刪除**快取裡面的a

b順利初始化完畢,將自己放到一級快取裡面(此時b裡面的a依然是建立中狀態)

然後回來接著建立a,此時b已經建立結束,直接從一級快取裡面拿到b,然後完成建立,並將a自己放到一級快取裡面。

①(step over)代表是單步,一步步走

② (step into)代表是原始碼天生的自然進入,這是打debug本身jdk自帶的原始碼,原始碼裡面沒有你自己所寫的**;

③(force step into) 這個是強制進入,這個一般用來debug強制進入自己所寫的源**

④一般原始碼級別的除錯, (step into)足夠了,但如果你要用(force step into) 也完全可以。

⑤ 如果找不到剛才停留的那一行的debug,如果斷點打飛了怎麼辦,這個時候請選擇show execution point (也叫歸位)

Spring迴圈依賴 原始碼上分析

一 spring bean 的建立 四個階段 二 defaultsingletonbeanregistry 三個主要不同階段bean的map 今天所要主要關注是 例項化 instantiation createbeaninstance 和 屬性賦值 populate populatebean 量階段...

Spring 解決迴圈依賴原始碼分析

迴圈依賴就是n個類之間迴圈巢狀引用,如a依賴b,b又依賴a,你中有我,我中有你。例項化a時發現需要b屬性,於是去例項化b,發現需要a屬性。如果spring不對這種迴圈依賴進行處理程式就會無限執行,導致記憶體溢位 系統崩潰。迴圈依賴又分為構造器迴圈依賴和屬性迴圈依賴,由於spring不支援構造器迴圈依...

Spring迴圈依賴解決原始碼解析

相關方法 1 spring無法解決構造方法注入引起的迴圈依賴問題 2 spring無法解決多例物件的迴圈依賴問題,因為多例物件是不進行快取的 第一級快取 快取已經完成了例項化和屬性設定的單例物件 單例物件快取 private final map singletonobjects newconcurr...