提到spring,我們應該印象最深刻的就是ioc (inversion of control)
,即控制反轉。
關於ioc,其實是一種設計理念,只是spring將這個理念體現的淋漓盡致,所以一說到spring,我們固然會很快的聯想到ioc。ioc還有另外乙個名字叫di (dependency injection)
即依賴注入,其實,準確的來說,ioc是理念,那di就是ioc的實現。
關於ioc更多詳細理解可以看看這篇文章,ioc 之 2.1 ioc基礎 ——跟我學spring3
關於spring容器,我們可以重點關注兩個介面:
defaultlistablebeanfactory
繼承關係如下:
從上圖我們可以看出,defaultlistablebeanfactory
最終實現的最頂層的介面就是beanfactory
,而beanfactory
只定義了諸如beanfactory#getbean()
等介面方法,所以spring通過子介面以及抽象實現類的方式可以提供更全面的功能,如abstractbeanfactory#createbean
用於建立例項化的bean。
關於spring容器的啟動流程,其實大致包括以下幾個步驟:
例項化beanfactory
,因為這是容器的基礎,spring中離不開beanfactory
。
對beanfactory
做一些初始化,如新增一些預設的元件。
讀取以及解析我們的配置類或者配置檔案,然後將讀取到的bean封裝到beandefinition
快取在乙個beandefinitionmap
中。
對解析到的beandefition
進行例項化。
在例項化bean的時候會執行bean屬性的填充,如依賴注入,然後做一些初始化,在初始化前後會執行bean的***。
public
(class<
?>..
. annotatedclasses)
例項化beanfactory
public
class
extends
implements
beandefinitionregistry
}
public()
public
annotatedbeandefinitionreader
(beandefinitionregistry registry, environment environment)
此處具體的註冊元件有:
public
static set
registerannotationconfigprocessors
( beandefinitionregistry registry,
@nullable object source)
// @autowired 的解析器if(
!(beanfactory.
getautowirecandidateresolver()
instanceof
contextannotationautowirecandidateresolver))
} set
beandefs =
newlinkedhashset
<
>(8
);// 註冊configurationclasspostprocessor,用於後續解析配置類if(
!registry.
containsbeandefinition
(configuration_annotation_processor_bean_name)
)// 註冊autowiredannotationbeanpostprocessor,用於bean例項化後的依賴注入if(
!registry.
containsbeandefinition
(autowired_annotation_processor_bean_name)
)// 註冊commonannotationbeanpostprocessor,用於@resource註解的依賴注入
// check for jsr-250 support, and if present add the commonannotationbeanpostprocessor.
if(jsr250present &&
!registry.
containsbeandefinition
(common_annotation_processor_bean_name)).
....
.// 註冊jpa的beanpostprocessor
// 註冊eventlistenermethodprocessor
// 註冊defaulteventlistene***ctory
return beandefs;
}
registry.
registerbeandefinition
(beanname, definitionholder.
getbeandefinition()
);
容器啟動public
void
refresh()
throws bean***ception, illegalstateexception
按順序檢視每個方法的作用,大致如下:
preparerefresh()
:容器重新整理前的準備,如設定當前已經容器已經啟用this.active.set(true)
。
obtainfreshbeanfactory()
:獲取當前上下文的beanfactory例項,檢查當前的refresh()
方法是否只被執行了一次,設定beanfactory
的serializationid。
invokebeanfactorypostprocessors(beanfactory)
:執行beanfactorypostprocessor
,用於解析@configuration
的配置類,如:掃瞄需要載入的bean(@componentscan
),通過@import
以及通過實現importbeandefinitionregistrar
載入對應的beandefinition
等。
registerbeanpostprocessors(beanfactory)
:按照優先順序去註冊beanpostprocessor
,通過呼叫abstractbeanfactory#getbean
建立所有的beanpostprocessor
的例項並快取在beanfactory
中,用於後續例項化其他bean的時候做一些攔截處理,如:aop生成**物件。
initmessagesource()
:初始化用於國際化的元件,這裡不重點研究。
onrefresh()
:模板方法,用於子類實現。
registerlisteners()
:註冊***。
finishbeanfactoryinitialization(beanfactory)
:這是重點方法,開始例項化所有的單例bean例項。
容器重新整理完畢後處理。
beanfactory的例項化obtainfreshbeanfactory()
:不同配置方式的beanfactory例項化。
beanfactory的準備:preparebeanfactory(beanfactory)
:鉤子方法的具體實現。
配置類的解析,invokebeanfactorypostprocessors(beanfactory)
:手把手玩轉 spring 之 配置類解析configurationclasspostprocessor
factorybean的建立finishbeanfactoryinitialization(beanfactory)
手把手玩轉 spring 之 factorybean的建立
單例bean的建立
單例bean的初始化
spring入門之IOC容器
ioc 其思想是反轉資源獲取的方向,傳統的資源查詢方式要求元件向容器發起請求查詢資源,作為回應,容器適時的返回資源 應用ioc後,容器主動地將資源推送給它所管理的元件,元件選擇一種合適的方式來接受資源 di 是ioc的另一種表達方式 即元件以一些預先定義好的方式 例如setter方法 接受來自容器的...
spring學習之IoC容器
jinnianshilongnian 寫道 理解ioc容器問題關鍵 控制的哪些方面被反轉了?1 誰控制誰?為什麼叫反轉?ioc容器控制,而以前是應用程式控制,所以叫反轉 2 控制什麼?控制應用程式所需要的資源 物件 檔案 3 為什麼控制?解耦元件之間的關係 4 控制的哪些方面被反轉了?程式的控制權發...
Spring之IOC容器篇
ioc inversion of control 控制反轉的英文縮寫 依賴物件的獲得被反轉了,一般是通過di dependency injection 依賴注入 來實現的,可以大大降低類之間的耦合度。ioc di是spring等框架的核心,或者說是基石,如果沒有ioc容器 di就沒有spring等框...