Struts
源碼的切片學(xué)習(xí)(五)
--
再談資源模塊的初始化
Author
???? :????? zhyiwww
E-Mail
????? :????? zhyiwww@163.com
Date
????????? :????? 2007-2-1
轉(zhuǎn)載請注明出處
m.tkk7.com/zhyiwww
(copyright by @ zhangyi)
?我以前已經(jīng)說過了,
Struts
的資源配置是,
ActionServlet.
通過
?
->init()
方法初始化
->
配置模塊(初始化系統(tǒng)的配置)
->
通過配置模塊取得資源的配置
->
資源模塊的初始化。
?
這是一個宏觀的過程。整體的思路是這樣的。那么,我們現(xiàn)在的疑問是:
資源模塊初始化的時候要先取得配置,那么配置從何而來
?
?
ModuleConfig config
;
MessageResourcesConfig mrcs[] =
config.findMessageResourcesConfigs();
通過這個語句,我們可以知道,其配置參數(shù)要通過
ModuleConfig
而來。
?
那么我們就要看一下,
MessageResourcesConfig
參數(shù)的數(shù)組是如何初始化的呢?
findMessageResourcesConfigs
()方法里面僅僅是完成了
ModuleConfig
中的一個一個
HashMap
實(shí)例的轉(zhuǎn)換,變成了一個數(shù)組。
那么我們還要知道,
到底這個
HashMap
是怎么樣初始化的,在什么時候初始化的
?
其實(shí)這個我們已經(jīng)找到了
ModuleConfig
的一個實(shí)現(xiàn)上來了,也就
ModuleConfigImpl
。
到這個地方就終止了。因?yàn)樵?/span>
ModuleConfigImpl
里面就沒有關(guān)于初始化里面的屬性的部分。那么到底在什么地方,什么時候,系統(tǒng)給與其初始化了呢?
這說明,在調(diào)用之前,系統(tǒng)一定已經(jīng)給與了初始化了。所以,我們在看
ActionServlet
的初始化模塊配置的部分。
看一下其配置模塊部分是如何進(jìn)行初始化的。
???????????
initModuleConfigFactory();
??????????? // Initialize modules as
needed
??????????? ModuleConfig
moduleConfig = initModuleConfig("", config);
現(xiàn)在我們就找到了這兩個語句。
上面的就是初始化工廠的,下面語句就是我們漏掉的部分,也就是在這里面,偷偷的進(jìn)行了系統(tǒng)的配置部分的初始化,也正是在這個部分,完成了所有的配置文件的解析和實(shí)例化。其利用的就是
Digester.
這一句,執(zhí)行結(jié)果的表面就是返回了一個
ModuleConfig
的實(shí)例
,
其實(shí)是
ModuleConfigImpl
的一個實(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í)例化一個解析器
ü???????
然后把配置文件放入棧里面,等待解析
ü???????
解析配置文件
?
其實(shí),也確實(shí)沒有什么特別的地方,但是在初始化解析器的時候,我們要告訴他,到底要怎么樣去解析,解析成什么對象的實(shí)例。這個部分其實(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é)果。
這個地方我們可以看到,
?
configDigester.addRuleSet(new
ConfigRuleSet());
定義了解析的規(guī)則,
其實(shí)這個規(guī)則是由
ConfigRuleSet
制定的。
在
ConfigRuleSet
里面,告訴了解析把每一個標(biāo)簽元素解析成什么樣的對象。
?
??????? 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)一樣的功能和目的。
這樣我們就知道了,通過這個過程之后,我們就把配置文件
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
對象的對應(yīng)屬性里面了。
所以,我們才可以從上面的部分直接去的其配置數(shù)組。
至于后面的消息資源模塊的初始化的其他細(xì)節(jié),在此不在詳細(xì)說明了。
|----------------------------------------------------------------------------------------|
版權(quán)聲明 版權(quán)所有 @zhyiwww
引用請注明來源 http://m.tkk7.com/zhyiwww
|----------------------------------------------------------------------------------------|
posted on 2007-02-01 17:32
zhyiwww 閱讀(1777)
評論(0) 編輯 收藏 所屬分類:
j2ee