Struts2初始化源码分析

1. Struts2 Web应用启动时,根据web.xml配置的核心过滤器FilterDispatcher,会初始化FilterDispatcher:

clip_image002

2. 正如我们知道的,过滤器初始化时,会自动调用init()方法进行初始化工作,所以在FilterDispatcher启动时,会自动调用init(FilterConfig filterConfig)方法,进行Struts2的初始化,首先在该方法中会创建org.apache.struts2.Dispatcher对象,将FilterDispatcher配置的初始化参数传到该对象中,然后调用dispatcher.init()方法加载并解析配置文件,最后加载静态资源配置参数packages。org.apache.struts2.dispatcher.FilterDispatcher.java源码如下图所示:

clip_image004

3. 在FilterDispatcher.init()方法中,首先创建Dispatcher类对象,并将FilterDispatcher配置的初始化参数传到对象中;相关代码,如下图所示:

clip_image006

4. 然后通过dispatcher.init()方法,加载并解析Struts2配置文件,配置文件的加载与解析是由Provider类来实现完成的,所以可分为两步:加载配置Provider、解析配置Provider,具体处理步骤如下:

a) 创建com.opensymphony.xwork2.config.ConfigurationManager,其中属性List<ContainerProvider> containerProviders存放所有配置Provider。

b) init_DefaultProperties():初始化一个用来加载default.properties的DefaultPropertiesProvider,并存入至containerProviders。

c) init_TraditionalXmlConfigurations():默认根据struts-default.xml,struts-plugin.xml,struts.xml (可根据init-param:config 修改加载路径) 分别创建三个 org.apache.struts2.config. StrutsXmlConfigurationProvider,并存入至containerProviders。

d) init_LegacyStrutsProperties():初始化初始化一个用来加载struts.properties的LegacyPropertiesConfigurationProvider,并存入至containerProviders。

e) init_CustomConfigurationProviders():根据init-param:configProviders初始化一个用户自定义实现的ConfigurationProvider接口的Provider,并存入至containerProviders。

f) init_FilterInitParameters():初始化一个用来加载web.xml中initParams配置的ConfigurationProvider, 并存入至containerProviders。

g) init_AliasStandardObjects() :初始化一个用来为所配置的Bean与具体类映射的BeanSelectionProvider,并存入至containerProviders。

h) init_PreloadConfiguration():以上几步存入ConfigurationProvider对象完毕后,按顺序循环调用上面几步存入的ConfigurationProvider的register、loadPackages、addPackage方法(先加载先解析),进行解析配置Provider。

小提示:

1. 加载配置Provider,其实就是加载配置文件;

2. 解析配置Provider,其实就是解析配置文件;

下面列出以上a-h步的相关代码,如下图所示:

1. Struts2中dispatcher.init()代码:

clip_image008

2. Struts2中init_PreloadConfiguration()方法代码:

clip_image010

3. XWork中configurationManager.getConfiguration()方法代码:

clip_image012

4. XWork中configuration.reloadContainer()方法代码:

clip_image014

5. Xwork中XmlConfigurationProvider.loadPackages()方法代码:

clip_image016

6. Xwork中XmlConfigurationProvider.addPackage ()方法代码:

clip_image018

4. 最后通过staticResourceLoader.setHostConfig(new FilterHostConfig(filterConfig))加载静态资源配置参数:packages,值得注意的是,还有另外三个固定的包和该参数进行拼接,分别是org.apache.struts2.static、template、和org.apache.struts2.interceptor.debugging,中间用空格隔开,经过解析将包名变成路径后存储到一个名叫pathPrefixes的数组中,这些目录中的文件会被自动搜寻;相关代码,如下图所示:

clip_image020

注:

关于源码分析,大概分为两种:流程源码分析、过程源码分析,因本人的初衷是流程源码分析,所以以上的分析是根据初始化处理流程顺序来进行分析的,并未对各个方法的过程细节做深入的讲解,望见谅。

转载于:https://my.oschina.net/xianggao/blog/80760

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值