Spring context架構 靜態結構

2021-07-10 05:00:36 字數 3386 閱讀 5475

context也就是我們常說的spring容器,打個比方,context就像是一家公司,beans則是公司的工廠,除了工廠,公司還有翻譯,倉庫以及辦公場所等等。

下面就看看context的主要構成部件。

}messagesource: 用於國際化的介面,可以將其理解為公司的翻譯。使用者可以通過bean配置自定義messagesource–要求name為「messagesource」,spring會在容器refresh時自動探測並且初始化它。

resourcepatternresolver: 對resourceloader的擴充套件,後者只支援對具體路徑資源的載入,而前者則支援對某pattern路徑資源的載入,預設是ant風格的模式。resource是特指配置檔案,或者class路徑(裡的掃瞄路徑)。我們可以將它理解為打單的機器,將各個地方發過來的單子打出來。

listablebeanfactory和hierachicalbeanfactory: 自然的context也是個工廠,context裡持有的依然是defaultlistablebeanfactory,通過它完成工廠的相應行為。介紹下這兩個工廠,前者主要用於取得批量bean,比如getbeansoftype;後乙個工廠則主要體現層級概念,但是context的parentfactory也是乙個context,這是因為context具有beanfactory的所有特徵。

enviromentcapable: 則類似是公司的行政部門,負責辦公場所等設施維護。它關聯著enviroment。enviroment也類似context是個包裝類,雖然繼承了propertyresolver,但在實現類裡是委託給configurablepropertyresolver處理的。enviroment代表應用環境,比如測試環境還是生產環境又或者開發環境。

使用者可以通過或者@profile指定某個配置的profile。然後通過activeprofile指定應用環境,從而會enable相應profile的beans

activeprofile可以通過5種方式指定:

1). servlet config init param,這種方式只適用於spring mvc的dispatcherservlet配置上

2). servlet context init param

3). system property

4). system env。以上四種方式設定的key均為spring.profiles.active

5.) @activeprofile,這種方式只適用於junit單元測試

context通過繼承獲得了工廠,事件發布,環境定義,資源載入以及國際化的能力。

這一節我只抽一些比較重要的介面的原始碼講述,主要還是注重概念和原理,後面會專門出一篇講context的動態處理過程,那裡面會對具體實現類做詳述。這一篇澤主要是建立對context靜態類結構的理解。

public

inte***ce lifecycle

使用者可以配置lifecycle型別bean,在context start以及stop時也會相應的啟動lifecycle bean的start或者stop。對於允許autostartup的smartlifecycle,context refresh的過程中會自動啟動。

public

inte***ce

extends

void setid(string id);

configurableenvironment getenvironment();

void setenvironment(configurableenvironment environment);

//新增bean後處理器,[beans架構](架構裡詳細講過後處理器

void addbeanfactorypostprocessor(beanfactorypostprocessor beanfactorypostprocessor);

//context核心方法,refresh是整個容器構建的過程

void refresh() throws bean***ception, illegalstateexception;

//註冊jdk程序退出時的hook

void registershutdownhook();

void close();

boolean isactive();

configurablelistablebeanfactory getbeanfactory() throws illegalstateexception;

}

public

inte***ce

extends

void setservletcontext(servletcontext servletcontext);

void setservletconfig(servletconfig servletconfig);

servletconfig getservletconfig();

void setnamespace(string namespace);

string getnamespace();

void setconfiglocation(string configlocation);

void setconfiglocations(string... configlocations);

string getconfiglocations();

}

再具體說下enviroment的實現,還是挺有意思的。下圖是enviroment的序列圖

主要說下mutablepropertysources和propertysource。

mutablepropertysources裡持有乙個property的list,對它迭代直到從乙個propertysource裡取出對應key的值就停止,從這可以就看出spring.profiles.active是有先後優先順序的。

Spring context檔案報錯

exception in thread main org.springframework.beans.factory.beandefinitionstoreexception line 8 in xml document from class path resource annotationcont...

Spring context命名空間

補充 之前我們使用property標籤進行依賴注入的時候,spring框架會獲取property的name屬性,呼叫set name 對該屬性進行注入 乙個配置檔案中,需要進行管理的bean的配置有很多,為了讓spring自己去載入這些bean,實現 零配置 引入context命名空間 xmlns ...

Spring Context 你真的懂了嗎

今天介紹一下大家常見的乙個單詞 context 應該怎麼去理解,正確的理解它有助於我們學習 spring 以及計算機系統中的其他知識。我們經常在程式設計中見到 context 這個單詞,當然每個人有每個人的理解,它被理解為 上下文 容器等等。我想說的是,context 理解為上下文最為合適。為什麼呢...