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





