zhyiwww
          用平實的筆,記錄編程路上的點點滴滴………
          posts - 536,comments - 394,trackbacks - 0

          Struts 源碼的切片學習(一) -Struts 初始化

          ?

          ?

          Author ???? :????? zhyiwww

          E-Mail ????? :????? zhyiwww@163.com

          Date ????????? :????? 2007-1-10

          轉載請注明出處 www.aygfsteel.com/zhyiwww

          (copyright by @ zhangyi)

          ?

          ?

          如果你的 Web 系統使用了 Struts 系統,那么此系統在啟動的時候就會對此框架進行初始化。作為一個可以擴展的系統來說,它就會考慮其擴展性,和用戶自定義后的配置的初始化。在 web.xml 文件中,也就是 web 的配置文件中,我們可以知道,在系統啟動的時候,就會初始化此 Servlet, 其實, Struts 的初始化也就是在此實現的。

          那么在那里實現框架的初始化呢?

          Servlet 在啟動的時候就會執行一個叫 init() 的方法,當然是自動執行。所以, Struts 的初始化實現就是在這里實現的。

          那么,

          Struts 的初始化到底初始化了那些東西呢?

          要知道這個問題,我們就要大致的知道, Struts 系統的幾個模塊:

          [1]? Struts 框架內部資源模塊

          [2]? 用戶擴展的配置模塊

          [3]? 資源文件配置模塊

          [4]? 數據源配置模塊

          [5]? PlugIn 配置模塊

          這幾個部分在 init() 的里面是按照順序初始化的。

          ?

          在初始化的過程中, struts 并不是簡單的 來順序初始化,而是使用一定的模式和思想,包括功能的封裝。

          其中內部資源文件和用戶的擴展的初始化是獨立完成的。而其他的三個模塊并不是這樣的。 這三個模塊的初始化是由一個模塊來統一管理的,這個模塊就叫配置模塊。在Struts里面就是ModuleConfig.

          所以如果要初始化上面的三個模塊就先要初始化配置模塊。

          現在你可能要問, 配置模塊如何初始化?

          配置模塊的初始化也不是直接 new ModuleConfig() 就可以了,他的實現也是通過工廠模式來實現的。

          所以,要先初始化一個配置工廠才能實現此實例化。

          配置模塊的工廠是 ModuleConfigFactory, 這是一個抽象類。其 createFactory() 方法可以實現一個工廠的實例。

          在這還有一個挺特別的地方,在工廠初始化的時候,定義了工廠類的名字 :

          ??? protected static String factoryClass =

          ??????? "org.apache.struts.config.impl.DefaultModuleConfigFactory";

          ,所以就可以自己去實現實例化,這樣就有了很大的擴展性,為什么呢?因為我們可以根據需要去修改它,那么他就去實現了我們自己的類的實例。

          其實這也就是 struts 的配置工廠可以自己實現的原因。

          補充說明一點:

          前面提到的擴展初始化就是指的此擴展。至于其他的擴展,我們以后再說。

          ? 現在,我們已經得到了一個配置的工廠實例了,那么通過此工廠我們可以生產出來一個配置了。

          也就是我們得到一個 ModuleConfig 的實例了。

          ModuleConfig config = factoryObject.createModuleConfig(prefix);

          這個方法就可以實現了。

          不過,你應該知道上面的工廠是一個抽象方法,而其抽象類不時別的方法,正是此方法, 那么此方法到底是誰具體實現了呢?

          我們上面說了,其實工廠實例化化的時候,其實創建了一個

          org.apache.struts.config.impl.DefaultModuleConfigFactory

          的對象, 這個類實現了此方法?如何實現的呢?

          ??? public ModuleConfig createModuleConfig(String prefix) {

          ??????? return new ModuleConfigImpl(prefix);

          }

          他實例化了一個 ModuleConfigImpl ,此類正是接口 ModuleConfig 的實現類。

          ?

          到此也許你也明白一些其中的邏輯,我覺得這是一個很好的實現。現在我才明白,為什么我們要去定義和使用接口。

          你想,在你初始化工廠之前,你并不知道要使用哪一個ModuleConfig的實現類。但是你一旦確定了使用哪一個配置工廠,不管是默認的,還是你自己的實現,那么你就只能生成對應的實例。正是,那種工廠生產那種產品。正如生產手機的工廠不能生產電視一樣。

          如果你自己定義了工廠的實現的話,那么你就會去實例化一個你自定義的ModuleConfig 的實現類。

          這一部分,其實是我對工廠模式的一點理解。

          ?

          好了,至此,我們得到了一個 ModuleConfig 的實例。

          下面,就在此基礎上,去初始化其他的模塊,就是下面的代碼:

          ?? ?????????initModuleConfigFactory();

          ??????????? // Initialize modules as needed

          ??????????? ModuleConfig moduleConfig = initModuleConfig("", config);

          ??????????? initModuleMessageResources(moduleConfig);

          ??????????? initModuleDataSources(moduleConfig);

          ?? ?????????initModulePlugIns(moduleConfig);

          ?

          至于詳細的如何配置和實現,我們以后再說。

          這些配置完成之后, Struts 就要去讀取你的在 web.xml 的自定義的 struts 配置文件參數,然后通過循環來取得此文件,逐個解析。

          主要是多個 struts-config.xml 的配置文件。

          都要去解析,這其實也是 struts 的靈活擴展之一。

          代碼如下:

          Enumeration names = getServletConfig().getInitParameterNames();

          ??????????? while (names.hasMoreElements()) {

          ??????????????? String name = (String) names.nextElement();

          ??????????????? if (!name.startsWith("config/")) {

          ??????????????????? continue;

          ??????????????? }

          ??????????????? String prefix = name.substring(6);

          ??????????????? moduleConfig = initModuleConfig

          ??????????????????? (prefix, getServletConfig().getInitParameter(name));

          ??????????????? initModuleMessageResources(moduleConfig);

          ??????????????? initModuleDataSources(moduleConfig);

          ??????????????? initModulePlugIns(moduleConfig);

          ??????????????? moduleConfig.freeze();

          ??????????? }

          ?

          取得一個配置文件后,執行的過程和我們上面的初始化的過程是一樣的,因為任何一個配置文件都可能有這些相同模塊的配置。所以要逐個的初始化。

          從宏觀上來說, strtuts 的初始化就這些,但是,在詳細的實現過程中,還有很多的細節,留待我們慢慢的去研究、理解、深入。

          ?

          ?

          ?

          ?

          ?

          ?



          |----------------------------------------------------------------------------------------|
                                     版權聲明  版權所有 @zhyiwww
                      引用請注明來源 http://www.aygfsteel.com/zhyiwww   
          |----------------------------------------------------------------------------------------|
          posted on 2007-01-23 17:40 zhyiwww 閱讀(2136) 評論(2)  編輯  收藏 所屬分類: j2ee

          FeedBack:
          # re: Struts源碼的切片學習(一)-Struts初始化[未登錄]
          2008-03-25 10:56 | yuyu
          hao hao hao !  回復  更多評論
            
          # http://chennai-java.blogspot.com/
          主站蜘蛛池模板: 郑州市| 乐至县| 台南县| 泰兴市| 玉田县| 宜兰县| 远安县| 长治市| 渑池县| 佳木斯市| 株洲县| 太谷县| 瑞金市| 米易县| 南木林县| 湖南省| 嘉黎县| 青海省| 巴里| 萨嘎县| 彭水| 长阳| 金塔县| 宣威市| 栾川县| 休宁县| 综艺| 德格县| 原阳县| 南皮县| 西乌| 武穴市| 石景山区| 开阳县| 东乌珠穆沁旗| 西乌珠穆沁旗| 宝兴县| 丘北县| 武邑县| 壶关县| 泰兴市|