public
void
refresh()
throws bean***ception, illegalstateexception
catch
(bean***ception var9)
this
.destroybeans()
;this
.cancelrefresh
(var9)
;throw var9;
}finally
}}
從**裡面可以看出,refresh方法就是spring容器啟動的整個過程,見名知意,obtainfreshbeanfactory就是重新整理bean工廠,封裝beandefinition的方法,我們重點來看下這個方法。
protected
abstract
void
refreshbeanfactory()
throws bean***ception, illegalstateexception;
點進去之後發現這裡是個抽象方法,那麼必然會有子類去實現它,所以這裡應用了模板方法的設計模式。
protected final void refreshbeanfactory() throws bean***ception
try catch (ioexception var2)
}
首先進行bean工廠的判斷,判斷beanfactory是否為空,如果不為空,則銷毀並且關閉beanfactory,下面才是重要的。
建立beanfactory,例項化defaultlistablebeanfactory物件
設定序列化id
個性化beanfactory
載入類裝填成beandefinition物件
將beanfactory賦值給當前物件的beanfactory
這裡我們重點看第4步,注意這裡又是乙個模板方法
protected
void
loadbeandefinitions
(defaultlistablebeanfactory beanfactory)
throws bean***ception, ioexception
委託xmlbeandefinitionreader進行xml的解析,跟進去發現分為兩步進行
document doc =
this
.doloaddocument
(inputsource, resource)
;int count =
this
.registerbeandefinitions
(doc, resource)
;
從這裡我們可以猜測,xml檔案通過流的方式載入進記憶體,解析成document物件,再把document中的每個bean節點轉化成beandefinition之後進行註冊,那下面看看這兩個方法的實現是不是這麼一回事呢
首先來看doloaddocument方法
public document loaddocument
(inputsource inputsource, entityresolver entityresolver, errorhandler errorhandler,
int validationmode,
boolean namespaceaware)
throws exception
documentbuilder builder =
this
.createdocumentbuilder
(factory, entityresolver, errorhandler)
;return builder.
parse
(inputsource)
;}
看到這些**是不是很熟悉,jdk原生**解析xml,那麼第一步和我們猜想的一致,那我們再來看看第二步registerbeandefinitions
}spring容器啟動過程中,不論是傳統的配置bean的方式,還是使用註解的方式,最終都是把需要例項化的類資訊(比如類名、類路徑、是否懶載入等)封裝成beandefinition物件,並以類名為key,beandefinition為value,放到map集合中去,所有例項化的類名放到list集合中去。
spring原始碼分析 spring原始碼分析
1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...
Spring原始碼之PostProcessor介面
spring框架提供了各種postprocessor的介面,作為容器或者bean的後置處理器,其實這些postprocessor本省也是需要註冊到容器總的bean,裡面定義的方法會在特定的時期唄容器所呼叫。通過這種機制框架自身或者開發者再不改變容器或者bean核心邏輯的的情況下對進行擴充套件或者定義...
Spring原始碼解析之 Aop原始碼解析(2)
spring aop 更多的是oop開發模式的乙個補充,幫助oop以更好的方式來解決對於需要解決業務功能模組之上統一管理 的功能 以一副圖來做為aop功能的說明更直觀些。對於類似系統的安全檢查,系統日誌,事務管理等相關功能,物件導向的開發方法並沒有更好的解決方法 aop引入了一些概念。更多的是spr...