Author:zhyiwww
EMail:
Date:
转载请注明出处
(copyrightby@zhangyi)
如果你的Web系统使用了Struts系统那么此系统在启动的时候就会对此框架进行初始化作为一个可以扩展的系统来说它就会考虑其扩展性和用户自定义后的配置的初始化在webxml文件中也就是web的配置文件中我们可以知道在系统启动的时候就会初始化此Servlet其实Struts的初始化也就是在此实现的
那么在那里实现框架的初始化呢?
Servlet在启动的时候就会执行一个叫init()的方法当然是自动执行所以Struts的初始化实现就是在这里实现的
那么
Struts的初始化到底初始化了那些东西呢?
要知道这个问题我们就要大致的知道Struts系统的几个模块
[]Struts框架内部资源模块
[]用户扩展的配置模块
[]资源文件配置模块
[]数据源配置模块
[]PlugIn配置模块
这几个部分在init()的里面是按照顺序初始化的
在初始化的过程中struts并不是简单的来顺序初始化而是使用一定的模式和思想包括功能的封装
其中内部资源文件和用户的扩展的初始化是独立完成的而其他的三个模块并不是这样的这三个模块的初始化是由一个模块来统一管理的这个模块就叫配置模块在Struts里面就是ModuleConfig
所以如果要初始化上面的三个模块就先要初始化配置模块
现在你可能要问配置模块如何初始化?
配置模块的初始化也不是直接newModuleConfig()就可以了他的实现也是通过工厂模式来实现的
所以要先初始化一个配置工厂才能实现此实例化
配置模块的工厂是ModuleConfigFactory这是一个抽象类其createFactory()方法可以实现一个工厂的实例
在这还有一个挺特别的地方在工厂初始化的时候定义了工厂类的名字:
protectedstaticStringfactoryClass=
onfigimplDefaultModuleConfigFactory;
所以就可以自己去实现实例化这样就有了很大的扩展性为什么呢?因为我们可以根据需要去修改它那么他就去实现了我们自己的类的实例
其实这也就是struts的配置工厂可以自己实现的原因
补充说明一点
前面提到的扩展初始化就是指的此扩展至于其他的扩展我们以后再说
现在我们已经得到了一个配置的工厂实例了那么通过此工厂我们可以生产出来一个配置了
也就是我们得到一个ModuleConfig的实例了
ModuleConfigconfig=factoryObjectcreateModuleConfig(prefix);
这个方法就可以实现了
不过你应该知道上面的工厂是一个抽象方法而其抽象类不时别的方法正是此方法那么此方法到底是谁具体实现了呢?
我们上面说了其实工厂实例化化的时候其实创建了一个
onfigimplDefaultModuleConfigFactory
的对象这个类实现了此方法?如何实现的呢?
publicModuleConfigcreateModuleConfig(Stringprefix){
returnnewModuleConfigImpl(prefix);
}
他实例化了一个ModuleConfigImpl此类正是接口ModuleConfig的实现类
到此也许你也明白一些其中的逻辑我觉得这是一个很好的实现现在我才明白为什么我们要去定义和使用接口
你想在你初始化工厂之前你并不知道要使用哪一个ModuleConfig的实现类但是你一旦确定了使用哪一个配置工厂不管是默认的还是你自己的实现那么你就只能生成对应的实例正是那种工厂生产那种产品正如生产手机的工厂不能生产电视一样
如果你自己定义了工厂的实现的话那么你就会去实例化一个你自定义的ModuleConfig的实现类
这一部分其实是我对工厂模式的一点理解
好了至此我们得到了一个ModuleConfig的实例
下面就在此基础上去初始化其他的模块就是下面的代码
initModuleConfigFactory();
//Initializemodulesasneeded
ModuleConfigmoduleConfig=initModuleConfig(config);
initModuleMessageResources(moduleConfig);
initModuleDataSources(moduleConfig);
initModulePlugIns(moduleConfig);
至于详细的如何配置和实现我们以后再说
这些配置完成之后Struts就要去读取你的在webxml的自定义的struts配置文件参数然后通过循环来取得此文件逐个解析
主要是多个strutsconfigxml的配置文件
都要去解析这其实也是struts的灵活扩展之一
代码如下
Enumerationnames=getServletConfig()getInitParameterNames();
while(nameshasMoreElements()){
Stringname=(String)namesnextElement();
if(!namestartsWith(config/)){
continue;
}
Stringprefix=namesubstring();
moduleConfig=initModuleConfig
(prefixgetServletConfig()getInitParameter(name));
initModuleMessageResources(moduleConfig);
initModuleDataSources(moduleConfig);
initModulePlugIns(moduleConfig);
moduleConfigfreeze();
}
取得一个配置文件后执行的过程和我们上面的初始化的过程是一样的因为任何一个配置文件都可能有这些相同模块的配置所以要逐个的初始化
从宏观上来说strtuts的初始化就这些但是在详细的实现过程中还有很多的细节留待我们慢慢的去研究理解深入