熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Struts源碼的切片學習之Struts的初始化

2013-11-23 20:03:05  來源: Java開源技術 
Author    :    zhyiwww
EMail    :    
Date        :    
轉載請注明出處 
(copyright by @ zhangyi)


     如果你的Web系統使用了Struts系統那麼此系統在啟動的時候就會對此框架進行初始化作為一個可以擴展的系統來說它就會考慮其擴展性和用戶自定義後的配置的初始化在webxml文件中也就是web的配置文件中我們可以知道在系統啟動的時候就會初始化此Servlet其實Struts的初始化也就是在此實現的
那麼在那裡實現框架的初始化呢?
Servlet在啟動的時候就會執行一個叫init()的方法當然是自動執行所以Struts的初始化實現就是在這裡實現的
那麼
Struts的初始化到底初始化了那些東西呢?
要知道這個問題我們就要大致的知道Struts系統的幾個模塊
[]    Struts框架內部資源模塊
[]    用戶擴展的配置模塊
[]    資源文件配置模塊
[]    數據源配置模塊
[]    PlugIn配置模塊
這幾個部分在init()的裡面是按照順序初始化的

    在初始化的過程中struts並不是簡單的來順序初始化而是使用一定的模式和思想包括功能的封裝
其中內部資源文件和用戶的擴展的初始化是獨立完成的而其他的三個模塊並不是這樣的這三個模塊的初始化是由一個模塊來統一管理的這個模塊就叫配置模塊在Struts裡面就是ModuleConfig
所以如果要初始化上面的三個模塊就先要初始化配置模塊
現在你可能要問配置模塊如何初始化?
    配置模塊的初始化也不是直接 new ModuleConfig()就可以了他的實現也是通過工廠模式來實現的
所以要先初始化一個配置工廠才能實現此實例化
配置模塊的工廠是ModuleConfigFactory這是一個抽象類其createFactory()方法可以實現一個工廠的實例
在這還有一個挺特別的地方在工廠初始化的時候定義了工廠類的名字:
    protected static String factoryClass =
        onfigimplDefaultModuleConfigFactory;
所以就可以自己去實現實例化這樣就有了很大的擴展性為什麼呢?因為我們可以根據需要去修改它那麼他就去實現了我們自己的類的實例
其實這也就是struts的配置工廠可以自己實現的原因
補充說明一點
前面提到的擴展初始化就是指的此擴展至於其他的擴展我們以後再說
 現在我們已經得到了一個配置的工廠實例了那麼通過此工廠我們可以生產出來一個配置了
也就是我們得到一個ModuleConfig的實例了
ModuleConfig config = factoryObjectcreateModuleConfig(prefix);
這個方法就可以實現了
不過你應該知道上面的工廠是一個抽象方法而其抽象類不時別的方法正是此方法那麼此方法到底是誰具體實現了呢?
我們上面說了其實工廠實例化化的時候其實創建了一個
onfigimplDefaultModuleConfigFactory
的對象這個類實現了此方法?如何實現的呢?
    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就要去讀取你的在webxml的自定義的struts配置文件參數然後通過循環來取得此文件逐個解析
主要是多個strutsconfigxml的配置文件
都要去解析這其實也是struts的靈活擴展之一
代碼如下
Enumeration names = getServletConfig()getInitParameterNames();
            while (nameshasMoreElements()) {
                String name = (String) namesnextElement();
                if (!namestartsWith(config/)) {
                    continue;
                }
                String prefix = namesubstring();
                moduleConfig = initModuleConfig
                    (prefix getServletConfig()getInitParameter(name));
                initModuleMessageResources(moduleConfig);
                initModuleDataSources(moduleConfig);
                initModulePlugIns(moduleConfig);
                moduleConfigfreeze();
            }

    取得一個配置文件後執行的過程和我們上面的初始化的過程是一樣的因為任何一個配置文件都可能有這些相同模塊的配置所以要逐個的初始化
    從宏觀上來說 strtuts的初始化就這些但是在詳細的實現過程中還有很多的細節留待我們慢慢的去研究理解深入
From:http://tw.wingwit.com/Article/program/Java/ky/201311/27862.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.