Struts2源码研究1

看struts2一周,就搞定了一个程序,郁闷。还有源码里的一个注入问题,一直得不到解决。
http://www.iteye.com/problems/2568
网上问了好久也没有满意的答案。。。。还是靠自己吧,自己研究。

首先,web.xml文件里的这一段肯定是个关键。

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

那么就从这里入手。
filter应该和servlet差不多,在struts2里面,当有请求发生时,就会匹配<url-pattern>/*</url-pattern>,如果匹配,则根据<filter-name>struts2</filter-name>找到<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>。
那么就到FilterDispatcher里看看。

Filter执行顺序是,init(),doFilter(),destroy()。先看init()

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);
}


this.filterConfig = filterConfig;

dispatcher = createDispatcher(filterConfig);
dispatcher.init();
这一段,是对struts2需要的资源的一个初始化。进到Dispatcher里面的init方法里,可以看到init了很多东西。


public void 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]

Container container = init_PreloadConfiguration();
init_CheckConfigurationReloading(container);
init_CheckWebLogicWorkaround(container);

}

这里很好理解。
Container container = init_PreloadConfiguration();
引起了我的注意,注入需要ioc容器,这个container是不是就是我要找的那个容器呢?而且它存在的包名叫com.opensymphony.xwork2.inject,可能行更大了。不过这玩样是webwork里的东东,那就下webwork的源码吧。
下载地址:http://www.opensymphony.com/
看官网上这句话
XWork is an command-pattern framework that is used to power Struts 2 as well as other applications. XWork provides an [color=red]Inversion of Control container[/color], a powerful expression language, data type conversion, validation, and pluggable configuration.
呵呵,八九不离十了。
init_PreloadConfiguration();
从名字可以看出,这个init方法是加载需要提前加载的配置。
到里面看看代码

private Container init_PreloadConfiguration() {
Configuration config = configurationManager.getConfiguration();
Container container = config.getContainer();

boolean reloadi18n = Boolean.valueOf(container.getInstance(String.class, StrutsConstants.STRUTS_I18N_RELOAD));
LocalizedTextUtil.setReloadBundles(reloadi18n);

ObjectTypeDeterminer objectTypeDeterminer = container.getInstance(ObjectTypeDeterminer.class);
ObjectTypeDeterminerFactory.setInstance(objectTypeDeterminer);

return container;
}


1,2两句就是获得container的,里面有什么东西,再往里看。看configurationManager.getConfiguration();

public synchronized Configuration getConfiguration() {
if (configuration == null) {
setConfiguration(new DefaultConfiguration(defaultFrameworkBeanName));
try {
configuration.reload(getConfigurationProviders());
} catch (ConfigurationException e) {
setConfiguration(null);
throw e;
}
} else {
conditionalReload();
}

return configuration;
}


这里的getConfigurationProviders()取到的providers就是前面1-7init里面所加的provider.
configuration.reload(getConfigurationProviders());再往里看。

public synchronized void reload(List<ConfigurationProvider> providers) throws ConfigurationException {
packageContexts.clear();
loadedFileNames.clear();

ContainerProperties props = new ContainerProperties();
ContainerBuilder builder = new ContainerBuilder();
for (ConfigurationProvider configurationProvider : providers)
{
configurationProvider.init(this);
configurationProvider.register(builder, props);
}
props.setConstants(builder);

builder.factory(Configuration.class, new Factory<Configuration>() {
public Configuration create(Context context) throws Exception {
return DefaultConfiguration.this;
}
});

try {
// Set the object factory for the purposes of factory creation
ObjectFactory.setObjectFactory(new ObjectFactory());

container = builder.create(false);
objectFactory = container.getInstance(ObjectFactory.class);
ObjectFactory.setObjectFactory(objectFactory);

for (ConfigurationProvider configurationProvider : providers)
{
container.inject(configurationProvider);
configurationProvider.loadPackages();
}

rebuildRuntimeConfiguration();
} finally {
ObjectFactory.setObjectFactory(null);
}
}

container.inject(configurationProvider);这一句不看代码也明了了。注入贝。
那么struts2里面的注入的大体流程应该就是这样的了(我的理解,不对的请拍砖。。。)
后面的细节再慢慢研究。^-^
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值