首先我們要搞清楚兩個概念:例項化/初始化
例項化:堆記憶體中申請一塊記憶體空間,類似租賃好房子,自己的家具東西還沒有搬家進去
初始化屬性填充:完成屬性的各種賦值,類似裝修、家電家具進場
**快取+四大方法
①**快取:
第一層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...