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