您的位置:首页 > 编程语言 > Java开发

struts2配置文件加载流程分析

2009-03-29 14:51 549 查看
首先org.apache.struts2.dispatcher. FilterDispatcher.java 中的init()方法,

public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
String param = filterConfig.getInitParameter("packages");//由此可以看出可以增加参数packages
String packages = "org.apache.struts2.static template org.apache.struts2.interceptor.debugging";
if (param != null) {
packages = param + " " + packages;
}
this.pathPrefixes = parse(packages);
dispatcher = new Dispatcher(filterConfig.getServletContext());
}


org.apache.struts2.dispatcher. Dispatcher.java
首先执行静态代码块:

static {
ObjectFactory.setObjectFactory(new StrutsObjectFactory());
ActionProxyFactory.setFactory(new StrutsActionProxyFactory());
}


执行构造方法
public Dispatcher(ServletContext servletContext) {
init(servletContext);
}
然后执行init()方法:

boolean reloadi18n = Boolean.valueOf(
(String) Settings.get(StrutsConstants.STRUTS_I18N_RELOAD)).booleanValue();
上面的语句读取了properties文件。

读取properties文件的流程:
首先执行Org.apache.struts2.dispatcher.Dispatcher.java 类的方法init()中的语句
boolean reloadi18n = Boolean.valueOf((String)
Settings.get(StrutsConstants.STRUTS_I18N_RELOAD)).booleanValue();

然后执行了org.apacher.struts2.config.Setting.java类中的方法
public static String get(String name) throws IllegalArgumentException {
String val = getInstance().getImpl(name);
return val;
}
然后执行了
public static Settings getInstance() {
return (settingsImpl == null) ? getDefaultInstance() : settingsImpl;
}
然后执行了

private static Settings getDefaultInstance() {
if (defaultImpl == null) {
// Create bootstrap implementation
defaultImpl = new DefaultSettings(); //产生了一个DefaultSettings对象
// Create default implementation
try {
String className = get(StrutsConstants.STRUTS_CONFIGURATION);
if (!className.equals(defaultImpl.getClass().getName())) {
try {
// singleton instances shouldn't be built accessing request or session-specific context data
defaultImpl = (Settings) ObjectFactory.getObjectFactory().buildBean(Thread.currentThread().getContextClassLoader().loadClass(className), null);
} catch (Exception e) {
LOG.error("Could not instantiate settings", e);
}
}
} catch (IllegalArgumentException ex) {
// ignore
}
}
return defaultImpl;
}


然后首先执行了语句defaultImpl = new DefaultSettings();

public DefaultSettings() {
// Create default implementations
// Use default properties and struts.properties
ArrayList list = new ArrayList();
try {
list.add(new PropertiesSettings("struts"));//从这里加载struts.properties文件
} catch (Exception e) {
log.warn("Could not find or error in struts.properties", e);
}
try {
list.add(new PropertiesSettings("org/apache/struts2/default")); //加载默认的defualt.properties文件
} catch (Exception e) {
log.error("Could not find org/apache/struts2/default.properties", e);
}
Settings[] configList = new Settings[list.size()];//定义了Settings对象数组
config = new DelegatingSettings((Settings[]) list.toArray(configList));
// Add list of additional properties settingss
try {
StringTokenizer configFiles = new StringTokenizer((String) config.getImpl(StrutsConstants.STRUTS_CUSTOM_PROPERTIES), ",");
加载了用户自己定义的properties文件。
while (configFiles.hasMoreTokens()) {
String name = configFiles.nextToken();
try {
list.add(new PropertiesSettings(name));
} catch (Exception e) {
log.error("Could not find " + name + ".properties. Skipping");
}
}
configList = new Settings[list.size()];
config = new DelegatingSettings((Settings[]) list.toArray(configList));
} catch (IllegalArgumentException e) {
// thrown when Settings is unable to find a certain property
// eg. struts.custom.properties in default.properties which is commented
// out
}
// Add additional list of i18n global resource bundles
try {
LocalizedTextUtil.addDefaultResourceBundle("org/apache/struts2/struts-messages");
StringTokenizer bundleFiles = new StringTokenizer((String) config.getImpl(StrutsConstants.STRUTS_CUSTOM_I18N_RESOURCES), ", ");
while (bundleFiles.hasMoreTokens()) {
String name = bundleFiles.nextToken();
try {
log.info("Loading global messages from " + name);
LocalizedTextUtil.addDefaultResourceBundle(name);
} catch (Exception e) {
log.error("Could not find " + name + ".properties. Skipping");
}
}
} catch (IllegalArgumentException e) {
// struts.custom.i18n.resources wasn't provided
}
}


看看org.apache.struts2.config.DelegatingSettings.java下面的方法。

/**
* Gets the specified property - calls getImpl(String) method on config objects in config list
* until successful.
*
* @see #get(String)
*/
public String getImpl(String name) throws IllegalArgumentException {
// Delegate to the other settings
IllegalArgumentException e = null;
for (int i = 0; i < configList.length; i++) {
try {
return configList[i].getImpl(name);
} catch (IllegalArgumentException ex) {
e = ex;
// Try next config
}
}
throw e;
}


小结:
通过上面的代码分析,大家就可以明白为什么struts.properties中的配置项会自动覆盖default.properties中的属性,而不会配用户自定义的配置文件覆盖。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: