zhyiwww
          用平實(shí)的筆,記錄編程路上的點(diǎn)點(diǎn)滴滴………
          posts - 536,comments - 394,trackbacks - 0

          Struts 源碼的切片學(xué)習(xí)(五)

          -- 再談資源模塊的初始化


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

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

          Date ????????? :????? 2007-2-1

          轉(zhuǎn)載請(qǐng)注明出處 www.aygfsteel.com/zhyiwww

          (copyright by @ zhangyi)

          ?

          ?我以前已經(jīng)說過了, Struts 的資源配置是, ActionServlet. 通過
          ?

          ->init() 方法初始化

          -> 配置模塊(初始化系統(tǒng)的配置)

          -> 通過配置模塊取得資源的配置

          -> 資源模塊的初始化。

          ?
          這是一個(gè)宏觀的過程。整體的思路是這樣的。那么,我們現(xiàn)在的疑問是:

          資源模塊初始化的時(shí)候要先取得配置,那么配置從何而來 ?

          ?

          ModuleConfig config

          MessageResourcesConfig mrcs[] = config.findMessageResourcesConfigs();

          通過這個(gè)語句,我們可以知道,其配置參數(shù)要通過 ModuleConfig 而來。

          ?

          那么我們就要看一下, MessageResourcesConfig 參數(shù)的數(shù)組是如何初始化的呢?

          findMessageResourcesConfigs ()方法里面僅僅是完成了 ModuleConfig 中的一個(gè)一個(gè) HashMap 實(shí)例的轉(zhuǎn)換,變成了一個(gè)數(shù)組。

          那么我們還要知道, 到底這個(gè) HashMap 是怎么樣初始化的,在什么時(shí)候初始化的 ?

          其實(shí)這個(gè)我們已經(jīng)找到了 ModuleConfig 的一個(gè)實(shí)現(xiàn)上來了,也就 ModuleConfigImpl

          到這個(gè)地方就終止了。因?yàn)樵?/span> ModuleConfigImpl 里面就沒有關(guān)于初始化里面的屬性的部分。那么到底在什么地方,什么時(shí)候,系統(tǒng)給與其初始化了呢?

          這說明,在調(diào)用之前,系統(tǒng)一定已經(jīng)給與了初始化了。所以,我們?cè)诳?/span> ActionServlet 的初始化模塊配置的部分。

          看一下其配置模塊部分是如何進(jìn)行初始化的。

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

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

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

          現(xiàn)在我們就找到了這兩個(gè)語句。

          上面的就是初始化工廠的,下面語句就是我們漏掉的部分,也就是在這里面,偷偷的進(jìn)行了系統(tǒng)的配置部分的初始化,也正是在這個(gè)部分,完成了所有的配置文件的解析和實(shí)例化。其利用的就是 Digester.

          這一句,執(zhí)行結(jié)果的表面就是返回了一個(gè) ModuleConfig 的實(shí)例 , 其實(shí)是 ModuleConfigImpl 的一個(gè)實(shí)例。

          那么,我們就去看一下,里面究竟做了些什么?

          ??????? Digester digester = initConfigDigester();

          ?

          ??????? // Process each specified resource path

          ??????? while (paths.length() > 0) {

          ??????????? digester.push(config);

          ??????????? String path = null;

          ??????????? int comma = paths.indexOf(',');

          ??????????? if (comma >= 0) {

          ??????????????? path = paths.substring(0, comma).trim();

          ??? ????????????paths = paths.substring(comma + 1);

          ??????????? } else {

          ??????????????? path = paths.trim();

          ??????????????? paths = "";

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

          ?

          ??????????? if (path.length() < 1) {

          ??????????????? break;

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

          ?

          ??????????? this.parseModuleConfigFile(digester, path);

          ?

          上面的一段代碼,看上去也沒有什么特別的,但是,在后面卻是做了不少的工作。

          ?

          其實(shí),從上到下,我們可以這樣理解:

          ü??????? 先實(shí)例化一個(gè)解析器

          ü??????? 然后把配置文件放入棧里面,等待解析

          ü??????? 解析配置文件

          ?

          其實(shí),也確實(shí)沒有什么特別的地方,但是在初始化解析器的時(shí)候,我們要告訴他,到底要怎么樣去解析,解析成什么對(duì)象的實(shí)例。這個(gè)部分其實(shí)才是核心的部分。

          那么,到底他是怎么樣去初始化解析器的呢?

          我們看一下 initConfigDigester ()是如何實(shí)現(xiàn)的。

          ??????? // Create a new Digester instance with standard capabilities

          ??????? configDigester = new Digester();

          ??????? configDigester.setNamespaceAware(true);

          ??????? configDigester.setValidating(this.isValidating());

          ??????? configDigester.setUseContextClassLoader(true);

          ??????? configDigester.addRuleSet(new ConfigRuleSet());

          ?

          ??????? for (int i = 0; i < registrations.length; i += 2) {

          ??????????? URL url = this.getClass().getResource(registrations[i+1]);

          ??????????? if (url != null) {

          ??????????????? configDigester.register(registrations[i], url.toString());

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

          ??????? }

          ?

          ??????? this.addRuleSets();

          ?

          這一段代碼就實(shí)現(xiàn)了上面的初始化和實(shí)例化的功能,當(dāng)然是解析配置文件 xml 文件后的結(jié)果。

          這個(gè)地方我們可以看到,

          ? configDigester.addRuleSet(new ConfigRuleSet());

          定義了解析的規(guī)則,

          其實(shí)這個(gè)規(guī)則是由 ConfigRuleSet 制定的。

          ConfigRuleSet 里面,告訴了解析把每一個(gè)標(biāo)簽元素解析成什么樣的對(duì)象。

          ?

          ??????? digester.addObjectCreate

          ??????????? ("struts-config/data-sources/data-source",

          ???????????? "org.apache.struts.config.DataSourceConfig",

          ???????????? "className");

          ??????? digester.addSetProperties

          ??????????? ("struts-config/data-sources/data-source");

          ??????? digester.addSetNext

          ??????????? ("struts-config/data-sources/data-source",

          ???????????? "addDataSourceConfig",

          ???????????? "org.apache.struts.config.DataSourceConfig");

          ??? …………………………………

          ????????????? 還有很多,但是都是實(shí)現(xiàn)一樣的功能和目的。

          這樣我們就知道了,通過這個(gè)過程之后,我們就把配置文件 struts-config.xml 或者你自己的配置的文件中的配置解析到了對(duì)象中。

          具體到消息資源模塊的部分就是:

          ?? digester.addObjectCreate

          ??????????? ( "struts-config/message-resources" ,

          ???????????? "org.apache.struts.config.MessageResourcesConfig" ,

          ???????????? "className" );

          ??????? digester.addSetProperties

          ??????????? ( "struts-config/message-resources" );

          ??????? digester.addSetNext

          ??????????? ( "struts-config/message-resources" ,

          ???????????? "addMessageResourcesConfig" ,

          ???????????? "org.apache.struts.config.MessageResourcesConfig" );

          ?

          ? ??????digester.addSetProperty

          ??????????? ( "struts-config/message-resources/set-property" ,

          ???????????? "property" , "value" );

          這一段代碼告訴我們把消息資源的配置的部分放到了 org.apache.struts.config.MessageResourcesConfig 對(duì)象的對(duì)應(yīng)屬性里面了。

          所以,我們才可以從上面的部分直接去的其配置數(shù)組。

          至于后面的消息資源模塊的初始化的其他細(xì)節(jié),在此不在詳細(xì)說明了。



          |----------------------------------------------------------------------------------------|
                                     版權(quán)聲明  版權(quán)所有 @zhyiwww
                      引用請(qǐng)注明來源 http://www.aygfsteel.com/zhyiwww   
          |----------------------------------------------------------------------------------------|
          posted on 2007-02-01 17:32 zhyiwww 閱讀(1779) 評(píng)論(0)  編輯  收藏 所屬分類: j2ee
          主站蜘蛛池模板: 胶南市| 光泽县| 克拉玛依市| 建平县| 论坛| 罗山县| 布拖县| 阿拉善右旗| 盐源县| 罗源县| 来宾市| 田阳县| 富顺县| 澎湖县| 山阴县| 盘山县| 阿勒泰市| 康乐县| 当阳市| 福州市| 达尔| 陆河县| 繁峙县| 堆龙德庆县| 怀化市| 多伦县| 永宁县| 尉犁县| 祁阳县| 西藏| 长葛市| 吉林市| 临沭县| 滦平县| 金山区| 沂水县| 偏关县| 鲜城| 清原| 河北省| 平遥县|