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 理解為上下文最為合適。為什麼呢...