关于Commons Configuration 2.x版本

本文介绍了Apache Commons Configuration从1.x到2.x的主要变化,包括结构的调整,虽然Configuration接口变动不大,但创建、初始化和管理配置对象的方式有了显著不同,特别是基于文件的配置方式如PropertiesConfiguration和XMLConfiguration。1.x版本的构造方法即时加载配置,导致一些潜在问题,如设置影响数据、非线程安全等。2.x版本动态更新配置的实现也有所不同,提供了更灵活的配置管理方式。

Apache Commons Configuration 已经升级到了2.x的版本,然而,国内多数的博客在介绍这个框架的时候,还是基于1.x版本的,现在简单介绍下2.x版本和1.x版本的区别。

1.结构发生了变化;

1.x的时候:

import org.apache.commons.configuration.ConfigurationException;

import org.apache.commons.configuration.PropertiesConfiguration;

import org.apache.commons.configuration.reloading.FileChangedReloadingStrategy;

2.x:

import org.apache.commons.configuration2.FileBasedConfiguration;

import org.apache.commons.configuration2.PropertiesConfiguration;

import org.apache.commons.configuration2.builder.ReloadingFileBasedConfigurationBuilder;

import org.apache.commons.configuration2.builder.fluent.Parameters;

import org.apache.commons.configuration2.ex.ConfigurationException;

import org.apache.commons.configuration2.reloading.PeriodicReloadingTrigger;

2.读写配置数据的Configuration 接口变化倒是不大

可以沿用1.x版本的方法,
如:

private PropertiesConfiguration properties;

properties.getString.....

properties.getFloat.....

getProperties(getPropertiesFilePath())
等等。

3.主要区别在于创建、初始化和管理配置对象的方式。

尤其是对于基于文件的配置如PropertiesConfigurationor和XMLConfiguration来说,1.x的构造方法会立刻加载配置实例。
1.x的时候我们使用以下方式创建:

// Version 1.x: Initializing a properties configurationPropertiesConfigurationconfig=newPropertiesConfiguration("myconfig.properties");

config.setThrowExceptionOnMissing(true);

config.setIncludesAllowed(false);

config.setListDelimiter(';');

代码简单吧!但是,也存在一些不明显的问题,
1)有些设置影响了配置的数据。配置项的分隔符和允许的标识也被读到了配置值当中。
2)构造方法为配置数据调用了protected方法;这个会导致一些小问题因为这个时候实例还没有被初始化。
3)各种set方法不是线程安全的。如果配置的实例被其他线程调用……

4.动态更新方式的写法也完全不同。

实际来说,我们可以完全使用动态更新的方式来加载配置项,不是么?

private boolean initializeConfig() {
        try {
            logger.debug("LOADING PROPERTIES........");
            Parameters params = new Parameters();
            File propertiesFile = new File(URLDecoder.decode(getPropertiesFilePath(), UTF_8));

            ReloadingFileBasedConfigurationBuilder<FileBasedConfiguration> reloadbuilder = new ReloadingFileBasedConfigurationBuilder<FileBasedConfiguration>(
                    PropertiesConfiguration.class)
                            .configure(params.fileBased().setEncoding(UTF_8).setFile(propertiesFile));
            logger.debug("SETTING PROPERTIES TO AUTO SAVE........");
            reloadbuilder.setAutoSave(true);
            PeriodicReloadingTrigger trigger = new PeriodicReloadingTrigger(reloadbuilder.getReloadingController(),
                    null, 1, TimeUnit.MINUTES);
            trigger.start();

            properties = (PropertiesConfiguration) reloadbuilder.getConfiguration();

        } catch (UnsupportedEncodingException e) {
            logger.error("UnsupportedEncodingException in AbstractConfigUtil.initializeConfig()", e);
        } catch (ConfigurationException e) {
            logger.error("ConfigurationException in AbstractConfigUtil.initializeConfig()", e);
        }
        isSucess = properties != null;
        return isSucess;
    }
    public boolean isSucess() {
        return isSucess;
    }

    private String getPropertiesFilePath() {
        logger.info("LOAD PROPERTIES FROM: "
                + Thread.currentThread().getContextClassLoader().getResource(getPropertiesFilename()).getPath());
        return Thread.currentThread().getContextClassLoader().getResource(getPropertiesFilename()).getPath();
    }

    //description 由子类提供properties文件名,properties文件必须位于resources目录下

    public abstract String getPropertiesFilename();
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值