绘制Struts2启动时执行过程的时序图如上所示。现在我们从代码的角度来分析上述的过程。
Struts的核心组建为名叫StrutsPrepareAndExecuteFilter的过滤器。在Tomcat启动的时候会执行过滤器器的init()方法。
1.执行StrutsPrepareAndExecuteFilter的init()方法
public void init(FilterConfig filterConfig) throws ServletException {
InitOperations init = new InitOperations();
Dispatcher dispatcher = null;
try {
FilterHostConfig config = new FilterHostConfig(filterConfig);
init.initLogging(config);
dispatcher = init.initDispatcher(config);
init.initStaticContentLoader(config, dispatcher);
prepare = new PrepareOperations(dispatcher);
execute = new ExecuteOperations(dispatcher);
this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);
postInit(dispatcher, filterConfig);
} finally {
if (dispatcher != null) {
dispatcher.cleanUpAfterInit();
}
init.cleanup();
}
2.执行了InitOperations的initDispatcher方法
Dispathcer是Struts中很核心的一个类。它用来初始化配置文件和调用指定的Action的execute()方法。
dispatcher = init.initDispatcher(config);
初始化该类的具体细节:
public Dispatcher initDispatcher( HostConfig filterConfig ) {
Dispatcher dispatcher = createDispatcher(filterConfig);
dispatcher.init();
return dispatcher;
}
3.调用Dispatcher的init方法
我们看init方法内部的细节:
init_DefaultProperties(); // [1]
init_TraditionalXmlConfigurations(); // [2]
如上这两个方法分别加载了不同的配置文件。
4. init_DefaultProperties()
根据方法名也不能看出,该方法加载了默认的属性文件。
该方法其实是调用了DefaultPropertiesProvider的register()方法。在register()方法中加载了org/apache/struts2/default
5. init_TraditionalXmlConfigurations();
观察该类源码:
private void init_TraditionalXmlConfigurations() {
String configPaths = initParams.get("config");
if (configPaths == null) {
configPaths = DEFAULT_CONFIGURATION_PATHS;
}
String[] files = configPaths.split("\\s*[,]\\s*");
for (String file : files) {
if (file.endsWith(".xml")) {
if ("xwork.xml".equals(file)) {
configurationManager.addContainerProvider(createXmlConfigurationProvider(file, false));
} else {
configurationManager.addContainerProvider(createStrutsXmlConfigurationProvider(file, false, servletContext));
}
} else {
throw new IllegalArgumentException("Invalid configuration file name");
}
}
}
该方法加载了如下的配置文件:
struts-default.xml,struts-plugin.xml,struts.xml
如上过程就是Tomcat在启动过程中执行流程,主要是加载了很多配置文件。后面的文章会逐渐分析Struts2框架的其他源码内容。