zhyiwww
用平实的笔,记录编程路上的点点滴滴………
posts - 536,comments - 394,trackbacks - 0

Struts 源码的切片学习(五)

-- 再谈资源模块的初始化


Author      :      zhyiwww

E-Mail       :      zhyiwww@163.com

Date           :      2007-2-1

转载请注明出处 www.BlogJava.net/zhyiwww

(copyright by @ zhangyi)

 

 我以前已经说过了, Struts 的资源配置是, ActionServlet. 通过
 

->init() 方法初始化

-> 配置模块(初始化系统的配置)

-> 通过配置模块取得资源的配置

-> 资源模块的初始化。

 
这是一个宏观的过程。整体的思路是这样的。那么,我们现在的疑问是:

资源模块初始化的时候要先取得配置,那么配置从何而来 ?

 

ModuleConfig config

MessageResourcesConfig mrcs[] = config.findMessageResourcesConfigs();

通过这个语句,我们可以知道,其配置参数要通过 ModuleConfig 而来。

 

那么我们就要看一下, MessageResourcesConfig 参数的数组是如何初始化的呢?

findMessageResourcesConfigs ()方法里面仅仅是完成了 ModuleConfig 中的一个一个 HashMap 实例的转换,变成了一个数组。

那么我们还要知道, 到底这个 HashMap 是怎么样初始化的,在什么时候初始化的 ?

其实这个我们已经找到了 ModuleConfig 的一个实现上来了,也就 ModuleConfigImpl

到这个地方就终止了。因为在 ModuleConfigImpl 里面就没有关于初始化里面的属性的部分。那么到底在什么地方,什么时候,系统给与其初始化了呢?

这说明,在调用之前,系统一定已经给与了初始化了。所以,我们在看 ActionServlet 的初始化模块配置的部分。

看一下其配置模块部分是如何进行初始化的。

            initModuleConfigFactory();

            // Initialize modules as needed

            ModuleConfig moduleConfig = initModuleConfig("", config);

现在我们就找到了这两个语句。

上面的就是初始化工厂的,下面语句就是我们漏掉的部分,也就是在这里面,偷偷的进行了系统的配置部分的初始化,也正是在这个部分,完成了所有的配置文件的解析和实例化。其利用的就是 Digester.

这一句,执行结果的表面就是返回了一个 ModuleConfig 的实例 , 其实是 ModuleConfigImpl 的一个实例。

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

        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);

 

上面的一段代码,看上去也没有什么特别的,但是,在后面却是做了不少的工作。

 

其实,从上到下,我们可以这样理解:

ü        先实例化一个解析器

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

ü        解析配置文件

 

其实,也确实没有什么特别的地方,但是在初始化解析器的时候,我们要告诉他,到底要怎么样去解析,解析成什么对象的实例。这个部分其实才是核心的部分。

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

我们看一下 initConfigDigester ()是如何实现的。

        // 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();

 

这一段代码就实现了上面的初始化和实例化的功能,当然是解析配置文件 xml 文件后的结果。

这个地方我们可以看到,

  configDigester.addRuleSet(new ConfigRuleSet());

定义了解析的规则,

其实这个规则是由 ConfigRuleSet 制定的。

ConfigRuleSet 里面,告诉了解析把每一个标签元素解析成什么样的对象。

 

        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");

    …………………………………

              还有很多,但是都是实现一样的功能和目的。

这样我们就知道了,通过这个过程之后,我们就把配置文件 struts-config.xml 或者你自己的配置的文件中的配置解析到了对象中。

具体到消息资源模块的部分就是:

   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 对象的对应属性里面了。

所以,我们才可以从上面的部分直接去的其配置数组。

至于后面的消息资源模块的初始化的其他细节,在此不在详细说明了。



|----------------------------------------------------------------------------------------|
                           版权声明  版权所有 @zhyiwww
            引用请注明来源 http://www.blogjava.net/zhyiwww   
|----------------------------------------------------------------------------------------|
posted on 2007-02-01 17:32 zhyiwww 阅读(1768) 评论(0)  编辑  收藏 所属分类: j2ee

只有注册用户登录后才能发表评论。


网站导航: