我已經參透了符文,你輸了 ! — 瑞茲網上有許多對bean載入的講解文章,條例非常清晰,看完後會不想再自己寫,就像我看了張愛玲的**,不再想寫**,因為我覺得我寫人物的心理永遠也不會寫的比她真實,深刻。就像高曉松說,他看了《百年孤獨》再也不會想寫**一樣。可是別人寫的再好,畢竟是別人的,我還是要寫出來。
本文抄襲了部落格
由於我腦子裡面已經有了一些認識,所以有些細節沒有補全,若又不解,可取翻閱上面這邊部落格
在實現bean的載入前,spring為載入beandefinition做了大量的工作,但本文只討論spring完成beandefinition的讀取後的bean載入過程。
再深入細節前,有必要先對整體的流程有個了解,也許你看完一遍後會不知所云,可是等你了解了細節,再回頭看這張圖會有不畏浮雲遮望眼的感覺。
如下是dogetbean方法,該方法顯示了整個bean載入的骨架,這個方法值得你耐性看幾遍
//先對name進行轉換,因為name可能是別名或者是factorybean的名字
final string beanname =
transformedbeanname
(name)
; object bean;
//首先嘗試從**快取中逐級查詢
// eagerly check singleton cache for manually registered singletons.
object sharedinstance =
getsingleton
(beanname);if
(sharedinstance != null && args == null)
else
}//由於可能是從singletonfactories這一級快取中取出乙個的factory,所以要進一步執行其getobject方法,並執行
bean =
getobjectforbeaninstance
(sharedinstance, name, beanname, null);}
else
//嘗試去父工廠獲取
// check if bean definition exists in this factory.
beanfactory parentbeanfactory =
getparentbeanfactory()
;if(parentbeanfactory != null &&
!containsbeandefinition
(beanname)
)else}if
(!typecheckonly)
tryregisterdependentbean
(dep, beanname)
;try
catch
(nosuchbeandefinitionexception ex)}}
//正式開始乙個bean的建立
// create bean instance.
if(mbd.
issingleton()
)catch
(bean***ception ex)}}
);bean =
getobjectforbeaninstance
(sharedinstance, name, beanname, mbd);}
//若scope為prototype的構造過程
else
if(mbd.
isprototype()
)finally
bean =
getobjectforbeaninstance
(prototypeinstance, name, beanname, mbd);}
//若scope為singleton的建立過程
else
tryfinally}}
);bean =
getobjectforbeaninstance
(scopedinstance, name, beanname, mbd);}
catch
(illegalstateexception ex)}}
catch
(bean***ception ex)
讀完上面的**,我們要做的事就是,再去回到本文章的頭部,看一看那張圖,在腦中留下整個流程的印象。 spring原始碼分析 一 bean的註冊
a xml註冊獲取 system.out.println bean b 註解方式註冊的bean system.out.println bean configuration 告訴spring這是乙個配置類 public class mainconfig configuration components...
spring原始碼分析 spring原始碼分析
1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...
spring原始碼之bean包
測試 如下 建立乙個teacher類 public class teacher public void setdescription string description 在包下建立乙個spring.xml 在 測試 suppresswarnings deprecation public class...