玩轉Spring 之 IOC容器

2021-10-05 00:06:31 字數 4516 閱讀 7891

提到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等框...