Struts 源碼的切片學習(四)——配置模塊初始化的實現
Author
???? :????? zhyiwww
E-Mail
????? :????? zhyiwww@163.com
Date
????????? :????? 2007-1-10
轉載請注明出處
www.JavaResearch.org
(copyright by @ zhangyi)
Struts
中的
MessageResource
、
PlugIn
、數據源等,都是通過
ModuleConfig
來實現的。
那么在
ActionServlet
初始化上面的那些模塊之前,就先要初始化
ModuleConfig
,然后由
ModuleConfig
來負責其初始化。
在
ActionServlet
初始化
ModuleConfig
的時候,先要初始化配置工廠,然后由配置工廠:
?
???? initModuleConfigFactory();
之后再實例化一個
ModuleConfig
的對象。
ModuleConfig
moduleConfig = initModuleConfig("", config);
那么這個工廠到底初始化了什么?
現看源代碼:
??? protected void
initModuleConfigFactory(){
??????? String configFactory
= getServletConfig().getInitParameter("configFactory");
??????? if (configFactory !=
null) {
???????????
ModuleConfigFactory.setFactoryClass(configFactory);
??????? }
}
很明顯,現從配置參數取得其配置,如果用戶沒有作配置,那么就使用默認配置,如果用戶作了配置,那么就使用用戶的配置。
如果用戶作了配置的話,那么就執行設置成用戶的工廠。如何設置的呢?
??? public static void
setFactoryClass(String factoryClass) {
???????
ModuleConfigFactory.factoryClass = factoryClass;
???????
ModuleConfigFactory.clazz = null;
??? }
在此我們可以看到,直接給 ModuleConfigFactory.factoryClass 賦值,為什么可以這樣做呢?因為此變量是:
???
protected
static
String
factoryClass
=
???????
"org.apache.struts.config.impl.DefaultModuleConfigFactory"
;
由此定義決定了可以使用此賦值方法。因為此變量是一個靜態的變量。
正是因為此變量是一個靜態的變量,所以在下面的得工廠生成對象的時候就可以創建一個用戶自己的對象。
看一下是如何初始化 ModuleConfig ,看下面的源代碼:
?? protected ModuleConfig
initModuleConfig(String prefix, String paths)
??????? throws
ServletException {
?????? /*************************************************************
這個地方,我們可以看到,此時就由
ModuleConfigFactory
直接創建了一個工廠對象,而此時我們用的配置就是上面我們初始化后的配置。
如果用戶自己做了配置,那么此時初始化的工廠就是用戶指定后的工廠。如果沒有的話,那么就初始化的時默認的工廠。
也就是
???
protected
static
String
factoryClass
=
???????
"org.apache.struts.config.impl.DefaultModuleConfigFactory"
;
的一個實例。
*************************************************************/
?????????? 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;
??? }
那么初始化配置模塊的部分到底做了什么呢?
其實是生成了一個 ModuleConfig 的對象。這個對象是由其工廠產生的,由什么樣的工廠就會生成什么樣的產品。所以如果是用戶配置過的工廠,那么就會生成其對應的配置模塊的實現。
先看默認的情況:
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);
??? }
}
通過其默認工廠的實現,我們可以看到,其實例化了一個 ModuleConfigImpl 的對象,這是 ModuleConfig 的一種實現,也是當前 struts 的默認的實現。
?????? 如果是用戶配置了實現工廠的話,可能的實現就是:
public class UserModuleConfigFactory extends ModuleConfigFactory implements Serializable{
?????? public ModuleConfig createModuleConfig(String prefix) {
??????? return new ModuleConfigUserImpl(prefix);
??? }
}
?????? 當然,如果要啟用你的工廠的話,那么還要在你的配置文件中添加如下部分,在 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
>
這樣的話,你的工廠就可以生效了,也可以生成你自己的配置模塊的實例了。
到此,配置模塊的初始化也已經完成,下面就是要實現如何對各個不同的模塊進行初始化了。
|----------------------------------------------------------------------------------------|
版權聲明 版權所有 @zhyiwww
引用請注明來源 http://www.aygfsteel.com/zhyiwww
|----------------------------------------------------------------------------------------|