1.com.opensymphony.xwork2.config.entities.PackageConfig
PackageConfig中Constructor为protected,所有实例的初始化都要通过内部内Builder,例如:
PackageConfig pack = new PackageConfig.Builder("test").build();为何?
Builder的文档为:
/**
* The builder for this object. An instance of this object is the only way to
construct a new instance. The
* purpose is to enforce the immutability of the object. The methods are structured in
a way to support chaining.
* After setting any values you need, call the {@link #build()} method to create the
object.
*/
Build方法如下:
public PackageConfig build() {
target.actionConfigs = Collections.unmodifiableMap(target.actionConfigs);
target.globalResultConfigs = Collections.unmodifiableMap
(target.globalResultConfigs);
target.interceptorConfigs = Collections.unmodifiableMap
(target.interceptorConfigs);
target.resultTypeConfigs = Collections.unmodifiableMap
(target.resultTypeConfigs);
target.globalExceptionMappingConfigs = Collections.unmodifiableList
(target.globalExceptionMappingConfigs);
target.parents = Collections.unmodifiableList(target.parents);
PackageConfig result = target;
target = new PackageConfig(result);
return result;
}
最后为何在在原来target基础上新new一个PackageConfig呢?
我的想法是这样做的目的是保证PackageConfig是个immutable对象,就是说客户端得到的PackageConfig
对象都是不可变的,所有的可变性操作都是通过PackageConfig.Builder实现的。同样,ActionConfig、
ResultTypeConfig等Config类型对象的immutable也是通过这种方式实现的。
2.com.opensymphony.xwork2.config.Configuration
这个Configuration对象让我想起来Topcoder的ConfigurationAPI组件,一个DTO对象,用于向其他组件
提供对配置文件内容的映射。具体关系如下图:
与之不同的是,这里的Configuration还包括了一个reload方法,用于告诉Configuration加载配置文件
。当然,采用了Strategy模式,所有的配置文件读取细节都delegate给ConfigurationProvider,这样一
来便于更改配置文件细节,达到了与核心解耦的目的。
com.opensymphony.xwork2.config.providers.XmlConfigurationProvider便是读取XML配置文件的
provider。
3、com.opensymphony.xwork2.config.ConfigurationManager
这才是configuration最核心的地方。所有上面说到的Configuration或是ConfigurationProvider都被聚
合到ConfigurationManager里,通过getConfiguration这个方法得到Configuration对象。
public synchronized Configuration getConfiguration() {
if (configuration == null) {
setConfiguration(new DefaultConfiguration(defaultFrameworkBeanName));
try {
configuration.reloadContainer(getContainerProviders());
} catch (ConfigurationException e) {
setConfiguration(null);
throw new ConfigurationException("Unable to load configuration.", e);
}
} else {
conditionalReload();
}
return configuration;
}
xwork源代码--Configuration
最新推荐文章于 2021-02-24 14:22:32 发布