本文翻譯自 – http://www.tigase.org/content/configuration-api 數據庫
組件的配置API實際上很是簡單,它包含兩個方法: api
1
2
|
Map getDefaults(Map params);
voidsetProperties(Map properties);
|
第一個方法從組件當中獲取缺省配置,第二個方法爲組件設置新的配置項。儘管看起來它們很是簡單,但若是想高效得使用,還須要瞭解更多知識。 數組
在咱們深刻了解所有的細節以前,須要首先知道組件的初始化順序,組件是如何「得到生命」的,以及配置是什麼時候被設置的。組件的加載和啓動順序是這樣的: 服務器
配置相關事項當中很重要的一點是:全部的組件都不會讀/請求/詢問配置信息,配置信息是由configuration manager推送給組件的。在服務器運行的時候,組件的setProperties()方法能夠屢次在任意時間被調用。這樣設計容許對服務器在運行時進行從新配置,開發者必定須要知道這一點,這樣纔可以在運行時對從新配置的數據進行正確處理。 網絡
兩個關於配置的方法具備相同的入口參數Map<String, Object>,因此本質上組件的配置信息所有是鍵值對。Object對象能夠是: socket
若是組件返回的缺省配置項是上面提到的任何一種數據類型,那麼setProperties()方法能夠確保設置的配置項必定是同一種類型。這對於開發者而言,在代碼中只須要有限得進行類型轉換。 ide
1
|
Map getDefaults(Map params);
|
這個方法在一般狀況下只被調用一次,就是在組件實例被建立以後。這個方法被用來從組件實例獲取一些缺省的配置信息,而後服務器能夠拿它們與用戶的提供的配置信息進行合併,產生缺省或最終的初始化配置信息。咱們建議這個方法返回全部的配置項及缺省值,這樣最終用戶在對組件進行配置的時候能夠看到全部的配置項,方便定位問題。組件的任何初始化代碼都不容許出如今該方法裏,開發者也不能想固然得認爲該方法只被調用一次。在任什麼時候候這個方法被調用,都只能返回組件的缺省配置,而不能返回經過setProperties()方法得到的最終配置信息。入口參數Map<String, Object>能夠包含一些「暗示」或者「預初始化」參數,它們會影響缺省配置的產生過程。這是由於一些組件的配置信息可能很複雜,並且這些配置信息具備不少的預設值或者會根據具體狀況自動進行優化。預設值能夠用來產生適合系統運行的缺省配置。若是組件 extend AbstractMessageReceiver,那麼這個方法的實現應該始終相似於下面的代碼: wordpress
1
2
3
4
5
6
|
@Override
publicMap getDefaults(Map params) {
Map defs =super.getDefaults(params);
defs.put(CONF_ENTRY_KEY, conf_entry_val);
returndefs;
}
|
1
|
voidsetProperties(Map<String, Object> properties);
|
這個方法用來爲組件設置配置信息。它能夠在服務器的生命週期中在任意時間被屢次調用。輸入的配置信息包含了全部經過調用getDefaults()方法所得到的缺省配置項,可是其中一些項的值可能因爲用戶錄入的配置數據被修改。若是組件extend AbstractMessageReceiver,那麼實現代碼可能爲: 函數
1
2
3
4
5
|
@Override
publicvoidsetProperties(Map properties) {
super.setProperties(properties);
intconf_entry_val = (Integer) properties.get(CONF_ENTRY_KEY);
}
|
有一些會提供給全部的組件並被它們所用到的全局配置項。一般這些配置項是每一個組件都會用到的共享資源。 優化
1
2
|
UserRepository user_repo;
user_repo = (UserRepository) properties.get(SHARED_USER_REPO_PROP_KEY);
|
1
2
|
UserRepository user_repo;
user_repo = (UserRepository) properties.get(SHARED_USER_REPO_POOL_PROP_KEY);
|
1
2
|
UserAuthRepository auth_repo;
auth_repo = (UserAuthRepository) properties.get(SHARED_AUTH_REPO_PROP_KEY);
|