Struts2源代码分析(一)配置文件加载
2009-12-23 19:26
375 查看
一直以来我都想找个时间好好研究一下Struts2的源代码,彻底弄清楚它的配置文件是如何加载和解析的?Action对象是如何创建的?属性等又是如何获取和注入的?拦截器和拦截器栈是如何实现的?
任何MVC框架都需要与Web应用整合,这就不得不借助于web.xml文件,只有配置在web.xml文件中Servlet才会被应用加载。
通常,所有的MVC框架都需要Web应用加载一个核心控制器,对于Struts 2框架而言,需要加载FilterDispatcher,只要Web应用负责加载FilterDispatcher,FilterDispatcher将会加载应用的Struts 2框架。因为Struts 2将核心控制器设计成Filter,而不是一个普通Servlet。故为了让Web应用加载FilterDispacher,只需要在web.xml文件中配置FilterDispatcher即可。
在web.xml文件中可以如下方式配置Struts2:
正如上面看到的,当配置Struts 2的FilterDispatcher类时,可以指定一系列的初始化参数,为该Filter配置初始化参数时,其中有3个初始化参数有特殊意义:
config:该参数的值是一个以英文逗号(,)隔开的字符串,每个字符串都是一个XML配置文件的位置。Struts 2框架将自动加载该属性指定的系列配置文件。如果没有指定该属性则默认使用如下三个配置文件struts-default.xml,struts-plugin.xml,struts.xml
actionPackages:该参数的值也是一个以英文逗号(,)隔开的字符串,每个字符串都是一个包空间,Struts 2框架将扫描这些包空间下的Action类。当然这些Action类的名称必须以"Action"为结尾。
configProviders:如果用户需要实现自己的ConfigurationProvider类,用户可以提供一个或多个实现了ConfigurationProvider接口的类,然后将这些类的类名设置成该属性的值,多个类名之间以英文逗号(,)隔开。
除此之外,还可在此处配置Struts 2常量,每个<init-param>元素配置一个Struts 2常量,其中<param-name>子元素指定了常量name,而<param-value>子元素指定了常量value。在这里配置的常量等价于在struts.properties文件中配置的属性。
在web.xml文件中配置了该Filter,还需要配置该Filter拦截的URL。通常,我们让该Filter拦截所有的用户请求,因此使用通配符来配置该Filter拦截的URL。
下述源代码分析我所针对的版本如下:
Struts2:struts-2.0.11.2(struts-2.0.11.2-all.zip)
xwork:xwork-2.0.5(xwork-2.0.5-all.zip)
从Struts2在web.xml文件中的配置可以看出,启动Struts2的关键在于类FilterDispatcher(org.apache.struts2.dispatcher.FilterDispatcher)的方法public void init(FilterConfig filterConfig) throws ServletException了。
下面我们就来看init()方法里面有些什么东西?
其中dispatcher = createDispatcher(filterConfig);实际上是取得过滤器初始化参数,构造成参数名称和参数值的映射,并且
创建了一个Dispather工具类的对象,关键的代码是那一句dispatcher.init() 。
dispather.init()方法,主要包括两部分,其中
if (configurationManager == null)
{
configurationManager = new ConfigurationManager(
BeanSelectionProvider.DEFAULT_BEAN_NAME);
}
init_DefaultProperties(); // [1]
init_TraditionalXmlConfigurations(); // [2]
init_LegacyStrutsProperties(); // [3]
init_ZeroConfiguration(); // [4]
init_CustomConfigurationProviders(); // [5]
init_MethodConfigurationProvider();
init_FilterInitParameters(); // [6]
init_AliasStandardObjects(); // [7]
是构造一个配置管理器实例对象,再将不同配置文件的解析类(配置提供者)和配置文件对应起来构造成一个配置提供者列表,供在后续的加载配置文件时使用。这里涉及两个概念,一个是配置管理器(com.opensymphony.xwork2.config.ConfigurationManager),它是整个Struts2的配置文件管理员;另一个是配置提供者,一个配置提供者完成对一个特定格式的配置文件的解析,在Struts中使用到的配置文件与配置提供者之间是一对一的关系。一个配置管理器实例对象包含一个配置提供者列表对象(List<ConfigurationProvider> configurationProviders)。
任何MVC框架都需要与Web应用整合,这就不得不借助于web.xml文件,只有配置在web.xml文件中Servlet才会被应用加载。
通常,所有的MVC框架都需要Web应用加载一个核心控制器,对于Struts 2框架而言,需要加载FilterDispatcher,只要Web应用负责加载FilterDispatcher,FilterDispatcher将会加载应用的Struts 2框架。因为Struts 2将核心控制器设计成Filter,而不是一个普通Servlet。故为了让Web应用加载FilterDispacher,只需要在web.xml文件中配置FilterDispatcher即可。
在web.xml文件中可以如下方式配置Struts2:
<!-- 配置Struts 2框架的核心Filter --> <filter> <!-- 配置Struts 2核心Filter的名字 --> <filter-name>struts</filter-name> <!-- 配置Struts 2核心Filter的实现类 --> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> <init-param> <!-- 配置Struts 2的配置文件 --> <param-name>config</param-name> <param-value> mystruts2.xml </param-value> </init-param> <init-param> <!-- 配置Struts 2框架默认加载的Action包结构 --> <param-name>actionPackages</param-name> <param-value> com.struts2.test.web.action </param-value> </init-param> <!-- 配置Struts 2框架的配置提供者类 --> <init-param> <param-name>configProviders</param-name> <param-value>com.struts2.test.web.MyConfigurationProvider</param-value> </init-param> <!-- 配置Struts 2框架的常量 --> <init-param> <param-name>truts.enable.DynamicMethodInvocation</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>struts.devMode</param-name> <param-value>false</param-value> </init-param> <init-param> <param-name>struts.objectFactory</param-name> <param-value>spring</param-value> </init-param> </filter> <filter-mapping> <!-- 配置Struts 2的核心FilterDispatcher拦截所有用户请求 --> <filter-name>struts</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
正如上面看到的,当配置Struts 2的FilterDispatcher类时,可以指定一系列的初始化参数,为该Filter配置初始化参数时,其中有3个初始化参数有特殊意义:
config:该参数的值是一个以英文逗号(,)隔开的字符串,每个字符串都是一个XML配置文件的位置。Struts 2框架将自动加载该属性指定的系列配置文件。如果没有指定该属性则默认使用如下三个配置文件struts-default.xml,struts-plugin.xml,struts.xml
actionPackages:该参数的值也是一个以英文逗号(,)隔开的字符串,每个字符串都是一个包空间,Struts 2框架将扫描这些包空间下的Action类。当然这些Action类的名称必须以"Action"为结尾。
configProviders:如果用户需要实现自己的ConfigurationProvider类,用户可以提供一个或多个实现了ConfigurationProvider接口的类,然后将这些类的类名设置成该属性的值,多个类名之间以英文逗号(,)隔开。
除此之外,还可在此处配置Struts 2常量,每个<init-param>元素配置一个Struts 2常量,其中<param-name>子元素指定了常量name,而<param-value>子元素指定了常量value。在这里配置的常量等价于在struts.properties文件中配置的属性。
在web.xml文件中配置了该Filter,还需要配置该Filter拦截的URL。通常,我们让该Filter拦截所有的用户请求,因此使用通配符来配置该Filter拦截的URL。
下述源代码分析我所针对的版本如下:
Struts2:struts-2.0.11.2(struts-2.0.11.2-all.zip)
xwork:xwork-2.0.5(xwork-2.0.5-all.zip)
从Struts2在web.xml文件中的配置可以看出,启动Struts2的关键在于类FilterDispatcher(org.apache.struts2.dispatcher.FilterDispatcher)的方法public void init(FilterConfig filterConfig) throws ServletException了。
下面我们就来看init()方法里面有些什么东西?
/** * Initializes the filter by creating a default dispatcher and setting the * default packages for static resources. * * @param filterConfig * The filter configuration */ public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; dispatcher = createDispatcher(filterConfig); dispatcher.init(); String param = filterConfig.getInitParameter("packages"); String packages = "org.apache.struts2.static template org.apache.struts2.interceptor.debugging"; if (param != null) { packages = param + " " + packages; } this.pathPrefixes = parse(packages); }
其中dispatcher = createDispatcher(filterConfig);实际上是取得过滤器初始化参数,构造成参数名称和参数值的映射,并且
创建了一个Dispather工具类的对象,关键的代码是那一句dispatcher.init() 。
public void init() { if (configurationManager == null) { configurationManager = new ConfigurationManager( BeanSelectionProvider.DEFAULT_BEAN_NAME); } //设置org/apache/struts2/default.properties文件的配置解析提供者 init_DefaultProperties(); // [1] /** * * config * 该参数的值是一个以英文逗号(,)隔开的字符串, * 每个字符串都是一个XML配置文件的位置。 * 默认配置文件为struts-default.xml,struts-plugin.xml,struts.xml * 这三个文件的配置解析提供者 */ init_TraditionalXmlConfigurations(); // [2] /** * 设置struts.properties文件的配置解析提供者 * 这个文件中的配置可以覆盖default.properties中的 */ init_LegacyStrutsProperties(); // [3] /** * actionPackages * 该参数的值也是一个以英文逗号(,)隔开的字符串, * 每个字符串都是一个包空间, * Struts 2框架将扫描这些包空间下的Action类。 */ init_ZeroConfiguration(); // [4] /** * 加载用户定制的配置管理器 * configProviders * 如果用户需要实现自己的ConfigurationProvider类, * 用户可以提供一个或多个实现了ConfigurationProvider接口的类, * 然后将这些类的类名设置成该属性的值,多个类名之间以英文逗号(,)隔开 */ init_CustomConfigurationProviders(); // [5] //该方法暂为空 init_MethodConfigurationProvider(); /** * 此方法用来处理FilterDispatcher的配置中所定义的所有属性 */ init_FilterInitParameters(); // [6] /** * 选择框架实现的关键扩展点,用于装载属性常量. * struts-default.xml中Struts2到底选择了那些实现类作为Struts2或者XWork内部接口默认实现类呢 * 默认情况下struts-default.xml中定义beanname="struts"将被作为默认接口实现类被注入这些默认行为是 * 由org.apache.struts2.config.BeanSelectionProvider所决定有兴趣读者可以参阅这个类源码 * 选择的实现是从container builder使用的名字定义关联属性,默认名为”struts” */ init_AliasStandardObjects(); // [7] Container container = init_PreloadConfiguration(); init_CheckConfigurationReloading(container); init_CheckWebLogicWorkaround(container); }
dispather.init()方法,主要包括两部分,其中
if (configurationManager == null)
{
configurationManager = new ConfigurationManager(
BeanSelectionProvider.DEFAULT_BEAN_NAME);
}
init_DefaultProperties(); // [1]
init_TraditionalXmlConfigurations(); // [2]
init_LegacyStrutsProperties(); // [3]
init_ZeroConfiguration(); // [4]
init_CustomConfigurationProviders(); // [5]
init_MethodConfigurationProvider();
init_FilterInitParameters(); // [6]
init_AliasStandardObjects(); // [7]
是构造一个配置管理器实例对象,再将不同配置文件的解析类(配置提供者)和配置文件对应起来构造成一个配置提供者列表,供在后续的加载配置文件时使用。这里涉及两个概念,一个是配置管理器(com.opensymphony.xwork2.config.ConfigurationManager),它是整个Struts2的配置文件管理员;另一个是配置提供者,一个配置提供者完成对一个特定格式的配置文件的解析,在Struts中使用到的配置文件与配置提供者之间是一对一的关系。一个配置管理器实例对象包含一个配置提供者列表对象(List<ConfigurationProvider> configurationProviders)。
相关文章推荐
- 【Spring】从源码分析Spring配置文件的加载
- struts2源码分析之配置文件加载顺序
- Spring源码分析:Bean加载流程概览及配置文件读取
- Spring IOC 源码分析-xml配置文件加载-注册
- Spring 源码分析:Bean 加载流程概览及配置文件读取
- spring源码分析-配置文件加载过程
- <util:properties/>加载的配置文件中有中文导致乱码,如何通过分析源码解决问题?
- 【Nutch2.2.1源代码分析之4】Nutch加载配置文件的方法
- org.apache.hadoop.yarn.conf.ConfigurationProviderFactory分析加载配置文件两种方式
- Struts2源代码分析(一)配置文件加载 .
- 【Nutch2.2.1源代码分析之4】Nutch加载配置文件的方法 分类: H3_NUTCH 2014-08-22 21:57 928人阅读 评论(0) 收藏
- Spring源码分析:Bean加载流程概览及配置文件读取
- SpringBoot源码分析之环境和配置文件的加载
- struts2配置文件加载流程分析
- 【Nutch2.2.1源代码分析之4】Nutch加载配置文件的方法
- Struts2源代码分析(一)配置文件加载
- Struts2源代码分析(一)配置文件加载
- Mybatis 源码分析--Configuration.xml配置文件加载到内存
- 【Nutch2.2.1源代码分析之4】Nutch加载配置文件的方法
- SpringMVC 项目配置文件加载过程分析(spring4.1.4)