天天看點

Webwork 學習之路(四)Configuration 詳解

<b>閱讀目錄</b>

<a href="http://www.cnblogs.com/java-class/p/5113897.html#_label0">1. configuration</a>

<a href="http://www.cnblogs.com/java-class/p/5113897.html#_label1">2. defaultconfiguration</a>

<a href="http://www.cnblogs.com/java-class/p/5113897.html#_label2">3. delegatingconfiguration</a>

<a href="http://www.cnblogs.com/java-class/p/5113897.html#_label3">4. webwork[三][四]小結</a>

  webwork做為經典的web mvc 架構,個人覺得源碼中配置檔案這部分代碼的實作十分考究。

  支援自定義自己的配置檔案、自定義配置檔案讀取類、自定義國際化支援。

  可以作為參考,單獨引入到其他項目中,下面是configuration相關類的繼承關系:

Webwork 學習之路(四)Configuration 詳解

configuration 作為 webwork 配置檔案的核心類,起到了配置資訊讀取的門戶,預設實作類中間引入了代理類 delegatingconfiguration 與底層的具體實作讀取的 propertiesconfiguration 完全解耦。在項目中使用時,隻需要引入 configuration 類,如下代碼即可擷取配置資訊;

getstring 方法會調用 configuration 自身的get 方法,get 方法中調用 getconfiguration 方法:

Webwork 學習之路(四)Configuration 詳解
Webwork 學習之路(四)Configuration 詳解

configuration 中定義的兩個靜态變量defaultimpl 和configurationimpl,還有 一個setconfiguration方法用來設定configurationimpl;

defaultimpl 是 webwork 的預設實作類執行個體的引用,在每一次讀取配置檔案時,都會去判斷是否在 webwork.properties 是否配置了 webwork.configuration 參數(其實架構是無法實作熱讀配置檔案的,下面會說到,每次判斷隻是确定讀取配置資訊,使用的架構預設類還是使用者自定義類);

如果設定了在調用 getdefaultconfiguration() 獲得自定義讀取類引用 configurationimpl,否則傳回 webwork 自己的 configuration 實作。

       (這裡要說一下,随意變動上線系統的配置檔案,你會悲劇的,修改前記得問清楚)

Webwork 學習之路(四)Configuration 詳解
Webwork 學習之路(四)Configuration 詳解

第一次調用 getdefaultconfiguration() 方法時,預設實作 defaultimpl 是空,則進入建立一 個 webwork 自己的實作 defaultconfiguration 的執行個體,并通過這個執行個體讀取 webwork 配置資訊。

上面代碼第5行有個特殊的地方,和下面的 delegatingconfiguration中的很相似,下面一起說。

Webwork 學習之路(四)Configuration 詳解
Webwork 學習之路(四)Configuration 詳解
Webwork 學習之路(四)Configuration 詳解

defaultconfiguration 并沒有直接取讀取properties檔案,而是通過 propertiesconfiguration 來實作properties檔案的讀取;

propertiesconfiguration 也同樣是 configuration 的子類,通過java.util.properties 來解析properties檔案,并 賦予自身properties 執行個體settings,并覆寫了父類的setimpl、getimpl、issetimpl、 listimpl 四個方法;

defaultconfiguration 通 過 propertiesconfiguration 首 先 加 載 的 是 webwork.properties,之後又加載了default.properties;

   (這裡需要說一下,default.properties 是webwork 架構自身的配置檔案,封裝在 jar 中,假如你在項目的 web.properties 中定義了與 default.properties 相同的參數,看上面程式配置檔案的加載順序,架構先加載你的配置檔案,然後加載預設配置檔案,你會發現你的參數是不會起作用的,如果你想讓你的參數覆寫架構中的,這裡你需要自定義配置檔案,并且在 項目 webwork.properties 中配置webwork.custom.properties 參數)

将 propertiesconfiguration 執行個體放入list中,然後建立一個和 list一樣大的configuration[]數組,并把list 轉型為 configuration[]賦予 執行個體化 delegatingconfiguration;

加載完兩個properties 檔案,并建立了delegatingconfiguration 執行個體之後, defaultconfiguration開始在這兩個屬性檔案中查找 webwork.custom.properties,檔案名之間用“,”隔開。找到配置後,分割檔案名并分别建立propertiesconfiguration 執行個體,加入list,加載完所有配置文 件後重新建立delegatingconfiguration 執行個體。

加載完所有的webwork 屬性檔案後, 查找屬性檔案中指定的國際化資源檔案(檔案名同樣用“,”隔開),如果有,則加載到 localizedtextutil 中,供以後使用。

       (畢竟是好多年前編寫的源碼,這裡面的 stringtokenizer 出于相容性的原因已經被遺留(雖然在新代碼中并不鼓勵使用它)。api 中建議所有尋求此功能的人使用 string 的 split 方法或 java.util.regex 包)

delegatingconfiguration 也同樣是 configuration 的子類,内部儲存了一個 configuration[]數組configlist,并覆 蓋了父類的setimpl、getimpl、issetimpl、listimpl 四個方法,實作對configlist 的操作;

如果使用者沒有指定自己的 configuration 實作,則 configuration.getstring 最終調用的是 delegatingconfiguration 的 getimpl;

在 delegatingconfiguration 的setimpl 方法實作中,有一個特别的地方,其實也就是上面 configuration提到的f,底層的實作:

Webwork 學習之路(四)Configuration 詳解
Webwork 學習之路(四)Configuration 詳解

   webwork不支援動态的增加屬性配置,但允許修改已配置的屬性, configlist[i].getimpl(name); 調用的是 propertiesconfiguration 的 getimpl 方法,實作如下:

Webwork 學習之路(四)Configuration 詳解
Webwork 學習之路(四)Configuration 詳解

    propertiesconfiguration 會在settings 裡去找name,如果找到就傳回配置資訊,在 delegatingconfiguration 的setimpl 方法中通過configlist[i].setimpl(name, value)修改該屬性的配置,否則抛illegalargumentexception 異常,該異常在 delegatingconfiguration 的 getimpl 方法中截 獲 ,繼續往被調用函數抛。 此時則不會執行 configlist[i].setimpl(name, value);進而保證了隻有配置過了的屬性可以被修改,在服務運作的過程中不會有新增的屬性,所有的屬性都由 web 服務第一次啟動的時候加載。

    以上分析我們可以看見,web 服務啟動的時候,servletdispatcher 通過 defaultconfiguration 先 加 載 webwork.properties 和 default.properties , 并 查 找 webwork.properties中webwork.custom.properties 配置的其他屬性檔案加載。加載完畢 後再通過屬性中配置的 webwork.custom.i18n.resources 加載國際化資源檔案供以後 使用。之後再查找 webwork.configuration 屬性看是否使用者指定了自己的 configuration 實作,如果有就用使用者自己的configuration 實作,否則傳回webwork 自己的實作(delegatingconfiguration)。大部分情況下,使用 webwork 自己的實作 已經足夠,使用者不需要自己去實作一個 configuration,除非你想加載xml等格式的配 置檔案。

如果,您認為閱讀這篇部落格讓您有些收獲,不妨點選一下右下角的【推薦】 

如果,您希望更容易地發現我的新部落格,不妨點選一下左下角的【關注我】 

如果,您對我的部落格内容感興趣,請繼續關注我的後續部落格,我是【orson】 

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段 聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。 

轉載:http://www.cnblogs.com/java-class/p/5113897.html