Spring原始碼之BeanDefinition解析

2021-10-12 05:21:33 字數 2464 閱讀 4122

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...