Struts 源碼的切片學(xué)習(xí)(四)——配置模塊初始化的實(shí)現(xiàn)
Author
???? :????? zhyiwww
E-Mail
????? :????? zhyiwww@163.com
Date
????????? :????? 2007-1-10
轉(zhuǎn)載請(qǐng)注明出處
www.JavaResearch.org
(copyright by @ zhangyi)
Struts
中的
MessageResource
、
PlugIn
、數(shù)據(jù)源等,都是通過
ModuleConfig
來實(shí)現(xiàn)的。
那么在
ActionServlet
初始化上面的那些模塊之前,就先要初始化
ModuleConfig
,然后由
ModuleConfig
來負(fù)責(zé)其初始化。
在
ActionServlet
初始化
ModuleConfig
的時(shí)候,先要初始化配置工廠,然后由配置工廠:
?
???? initModuleConfigFactory();
之后再實(shí)例化一個(gè)
ModuleConfig
的對(duì)象。
ModuleConfig
moduleConfig = initModuleConfig("", config);
那么這個(gè)工廠到底初始化了什么?
現(xiàn)看源代碼:
??? protected void
initModuleConfigFactory(){
??????? String configFactory
= getServletConfig().getInitParameter("configFactory");
??????? if (configFactory !=
null) {
???????????
ModuleConfigFactory.setFactoryClass(configFactory);
??????? }
}
很明顯,現(xiàn)從配置參數(shù)取得其配置,如果用戶沒有作配置,那么就使用默認(rèn)配置,如果用戶作了配置,那么就使用用戶的配置。
如果用戶作了配置的話,那么就執(zhí)行設(shè)置成用戶的工廠。如何設(shè)置的呢?
??? public static void
setFactoryClass(String factoryClass) {
???????
ModuleConfigFactory.factoryClass = factoryClass;
???????
ModuleConfigFactory.clazz = null;
??? }
在此我們可以看到,直接給 ModuleConfigFactory.factoryClass 賦值,為什么可以這樣做呢?因?yàn)榇俗兞渴牵?/span>
???
protected
static
String
factoryClass
=
???????
"org.apache.struts.config.impl.DefaultModuleConfigFactory"
;
由此定義決定了可以使用此賦值方法。因?yàn)榇俗兞渴且粋€(gè)靜態(tài)的變量。
正是因?yàn)榇俗兞渴且粋€(gè)靜態(tài)的變量,所以在下面的得工廠生成對(duì)象的時(shí)候就可以創(chuàng)建一個(gè)用戶自己的對(duì)象。
看一下是如何初始化 ModuleConfig ,看下面的源代碼:
?? protected ModuleConfig
initModuleConfig(String prefix, String paths)
??????? throws
ServletException {
?????? /*************************************************************
這個(gè)地方,我們可以看到,此時(shí)就由
ModuleConfigFactory
直接創(chuàng)建了一個(gè)工廠對(duì)象,而此時(shí)我們用的配置就是上面我們初始化后的配置。
如果用戶自己做了配置,那么此時(shí)初始化的工廠就是用戶指定后的工廠。如果沒有的話,那么就初始化的時(shí)默認(rèn)的工廠。
也就是
???
protected
static
String
factoryClass
=
???????
"org.apache.struts.config.impl.DefaultModuleConfigFactory"
;
的一個(gè)實(shí)例。
*************************************************************/
?????????? ModuleConfigFactory
factoryObject = ModuleConfigFactory.createFactory();
??????? ModuleConfig config =
factoryObject.createModuleConfig(prefix);
??????? // Configure the
Digester instance we will use
??????? 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);
??????? }
???????
getServletContext().setAttribute(
???????????
Globals.MODULE_KEY + config.getPrefix(),
??????????? config);
??????? // Force creation
and registration of DynaActionFormClass instances
??????? // for all dynamic
form beans we wil be using
??????? FormBeanConfig fbs[]
= config.findFormBeanConfigs();
??????? for (int i = 0; i
< fbs.length; i++) {
??????????? if
(fbs[i].getDynamic()) {
???????????????
fbs[i].getDynaActionFormClass();
??????????? }
??????? }
??????? return config;
??? }
那么初始化配置模塊的部分到底做了什么呢?
其實(shí)是生成了一個(gè) ModuleConfig 的對(duì)象。這個(gè)對(duì)象是由其工廠產(chǎn)生的,由什么樣的工廠就會(huì)生成什么樣的產(chǎn)品。所以如果是用戶配置過的工廠,那么就會(huì)生成其對(duì)應(yīng)的配置模塊的實(shí)現(xiàn)。
先看默認(rèn)的情況:
public class DefaultModuleConfigFactory extends ModuleConfigFactory implements Serializable{
??? // --------------------------------------------------------- Public Methods
??? /**
???? * Create and return a newly instansiated {@link ModuleConfig}.
???? * This method must be implemented by concrete subclasses.
???? *
???? * @param prefix Module prefix for Configuration
???? */
??? public ModuleConfig createModuleConfig(String prefix) {
??????? return new ModuleConfigImpl(prefix);
??? }
}
通過其默認(rèn)工廠的實(shí)現(xiàn),我們可以看到,其實(shí)例化了一個(gè) ModuleConfigImpl 的對(duì)象,這是 ModuleConfig 的一種實(shí)現(xiàn),也是當(dāng)前 struts 的默認(rèn)的實(shí)現(xiàn)。
?????? 如果是用戶配置了實(shí)現(xiàn)工廠的話,可能的實(shí)現(xiàn)就是:
public class UserModuleConfigFactory extends ModuleConfigFactory implements Serializable{
?????? public ModuleConfig createModuleConfig(String prefix) {
??????? return new ModuleConfigUserImpl(prefix);
??? }
}
?????? 當(dāng)然,如果要啟用你的工廠的話,那么還要在你的配置文件中添加如下部分,在 web.xml 中修改如下部分:
<
servlet
>
???
<
servlet-name
>
action
</
servlet-name
>
???
<
servlet-class
>
org.apache.struts.action.ActionServlet
</
servlet-class
>
???
<
init-param
>
?????
<
param-name
>
config
</
param-name
>
?????
<
param-value
>
/WEB-INF/struts-config.xml
</
param-value
>
???
</
init-param
>
???
<
init-param
>
?????
<
param-name
>
debug
</
param-name
>
?????
<
param-value
>
3
</
param-value
>
???
</
init-param
>
???
<
init-param
>
?????
<
param-name
>
detail
</
param-name
>
?????
<
param-value
>
3
</
param-value
>
</
init-param
>
???
<init-param>
?????
<param-name>configFactory</param-name>
?????
<param-value>org.aa.struts.
UserModuleConfigFactory
</param-value>
</init-param>
???
<
load-on-startup
>
0
</
load-on-startup
>
?
</
servlet
>
這樣的話,你的工廠就可以生效了,也可以生成你自己的配置模塊的實(shí)例了。
到此,配置模塊的初始化也已經(jīng)完成,下面就是要實(shí)現(xiàn)如何對(duì)各個(gè)不同的模塊進(jìn)行初始化了。
|----------------------------------------------------------------------------------------|
版權(quán)聲明 版權(quán)所有 @zhyiwww
引用請(qǐng)注明來源 http://www.aygfsteel.com/zhyiwww
|----------------------------------------------------------------------------------------|