10.Java Spring框架源碼分析
讀 Spring 源碼最怕迷路:方法套方法,回調套回調。這篇是位博主啃完實例化流程後畫的路線圖,從容器啓動到 Bean 就緒,關鍵方法一個不落,照着它讀源碼,心裏有張地圖。
先記住總路線。容器啓動後,核心就一件事:把所有非懶加載的單實例 Bean 建出來。入口是 finishBeanFactoryInitialization,關鍵動作是 preInstantiateSingletons。後面所有步驟,都是爲這件事服務的。
第一步,逐個創建。先拿到所有 Bean 的名字,一個個建。先看之前有沒有建過,注意這裏看的不是緩存,而是之前步驟的產物;沒有再去緩存裏找,還沒有才真正創建。順序是:先看看能不能直接返回代理對象,不能再走創建。
第二步,代理的學問。第一次拿業務 Bean 時,容器裏既沒有業務 Bean 也沒有代理 Bean,只能先創建業務 Bean,再執行後置處理生成代理。第二次來拿時,代理已經在了,直接返回。舉個具體例子:業務 Bean 叫 Calc,代理叫 CalcProxy。第一次兩手空空,只能現建現代理;第二次有代理在,直接交貨。想拿代理,靠的是調實例化前後的兩組後置處理,命中了就返回,沒命中才繼續往下走。
第三步,真正創建實例。調 doCreateBean,分四步:建實例、給屬性賦值、初始化、註冊銷燬方法。屬性賦值有三板斧:先過實例化後置處理,再處理屬性值,最後調 setter。初始化也有三件套:先執行所有後置處理的前置方法,再調自定義的初始化方法,最後執行後置處理的後置方法,代理 Bean 就是在這最後一步裏誕生的。
照這個順序讀源碼:先看名字怎麼一個個建,再看代理什麼時候插隊,最後看實例化四步。每個方法只幹一件事,順着這條線走,Spring 就不再是一團漿糊。
來源|博客園《10.Java Spring框架源碼分析》,https://www.cnblogs.com/ThinkerQAQ/p/18966188
評論(0)
暫無評論,來搶第一條。