看struts2一周,就搞定了一个程序,郁闷。还有源码里的一个注入问题,一直得不到解决。
http://www.iteye.com/problems/2568
网上问了好久也没有满意的答案。。。。还是靠自己吧,自己研究。
首先,web.xml文件里的这一段肯定是个关键。
那么就从这里入手。
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()
this.filterConfig = filterConfig;
dispatcher = createDispatcher(filterConfig);
dispatcher.init();
这一段,是对struts2需要的资源的一个初始化。进到Dispatcher里面的init方法里,可以看到init了很多东西。
这里很好理解。
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方法是加载需要提前加载的配置。
到里面看看代码
1,2两句就是获得container的,里面有什么东西,再往里看。看configurationManager.getConfiguration();
这里的getConfigurationProviders()取到的providers就是前面1-7init里面所加的provider.
configuration.reload(getConfigurationProviders());再往里看。
container.inject(configurationProvider);这一句不看代码也明了了。注入贝。
那么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里面的注入的大体流程应该就是这样的了(我的理解,不对的请拍砖。。。)
后面的细节再慢慢研究。^-^