xwork源代码--Configuration

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值