Commons Configuration软件类库提供通用配置接口,使Java应用程序从多种源读取配置文件。Commons Configuration提供简单类型访问和经过如下代码演示的多义配置参数:java
Double double = config.getDouble("number");apache
Integer integer = config.getInteger("number");
数组
配置参数能够从如下源加载:安全
Properties文件多线程
XML文档并发
Property list文件app
JNDI工具
JDBC DataSourceui
系统配置编码
Applet参数
Servlet参数
Configuration对象使用配置构建起建立。不一样的配置源可使用CombinedConfigurationBuilder和CombinedConfiguration混合使用。可使用扩展AbstractConfiguration或AbstractHierarchicalConfiguration的自定义配置对象建立额外的配置参数源。
Commons Configuration容许你从各类不一样的源访问配置属性。无论它们以properties文件、XML文档或JNDI树存储,都能经过通用Configuration接口的相同方式访问。
Commons Configuration的其它优点是能够混合异构配置源而且像简单逻辑配置处理。本文将介绍不一样的配置和如何联合使用。
当前有大量Configuration对象的不一样源。可是,可是只使用Configuration对象和一个特定类型,像XMLConfiguration或JNDIConfiguration,你躲避了实际检索配置值的机制。这些源包括:
PropertiesConfiguration从properties文件加载配置值。
XMLConfiguration从XML文档获取值。
INIConfiguration从Windows的.ini文件加载值。
PropertyListConfiguration从OpenStep .plist文件加载值。XMLPropertyListConfiguration也能读取Mac OS X使用的XML变体。
JNDIConfiguration使用JNDI树中的键,检索配置属性值。
BaseConfiguration内存中填充Configuration对象的方法。
HierarchicalConfiguration内存中可以处理复杂结构数据的Configuration对象。
SystemConfiguration使用系统属性的配置。
ConfigurationConverter须要一个java.util.Properties或一个org.apache.commons.collections.ExtendedProperties并转换它为一个Configuration对象。
一般你想要提供一组基本配置值,但容许用户易于在特定环境覆盖它们。一种方法是硬编码默认值到你的代码中,然而提供一个属性文件覆盖它。然而,这时很是死板的事情。使用CompositeConfiguration你能提供许多不一样的方式设置配置。你能够手工操做:
CompositeConfiguration config = new CompositeConfiguration();
config.addConfiguration(new SystemConfiguration());
config.addConfiguration(new PropertiesConfiguration("application.properties"));
或者经过ConfigurationFactory类:
ConfigurationFactory factory = new ConfigurationFactory("config.xml");
Configuration config = factory.getConfiguration();
config.xml是上面例子的配置描述符,它指定加载的Configuration对象。下面是描述符的例子:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<configuration>
<system/>
<properties fileName="application.properties"/>
</configuration>
这说的是咱们正在加载全部的系统属性,以及application.properties配置文件。优先顺序是从头至尾。所以,在上面的例子中,若是一个属性没有在系统配置中找到,它将在属性文件中查找。这容许你在配置文件中设置默认值,并使用系统属性覆盖它们。
该包中的全部类表明共享单个接口Configuration的不一样种类的配置源。该接口容许你以通用方式访问和操做配置属性。
Configuration接口中定义的方法能够分为从配置中查询数据和修改配置对象的方法。实际上,Configuration接口扩展一个基础接口ImmutableConfiguration。ImmutableConfiguration定义的 全部方法从配置中读取数据对象不能改变它的状态。Configuration添加了操做配置的方法。
定义在ImmutableConfiguration接口中的大部分方法处理不一样数据类型的属性检索。全部这些方法须要一个键做为参数指向指望的属性。该字符串值明确依赖于具体Configuration实现。它们尝试经过传入key查找特定属性并转换为它们的目标类型;转换值将被返回。全部方法也有重载变体容许指定默认值,若是属性没有找到,将返回默认值。支持如下开箱即用的数据类型:
BigDecimal
BigInteger
boolean
byte
double
float
int
long
short
String
这些方法的名称以get开头后随它们的数据类型。getString()方法将返回字符串值,getInt()将对整数值起做用。属性能够有多个值,所以它也能够查询一个包含全部有效值的列表或数组。这使用getList()或getArray()方法完成。
此外,有一组通用get方法尝试转换请求属性值到指定数据类型。该转换也支持集合或数组元素。
若是配置设置组织在特定接口中subset()方法是有用的,而应用程序只对该结构的部分感兴趣。subset()传入key前缀字符串并返回一个Configuration对象只包含键开始的前缀。
如下方法能用于操做属性或它们的值:
addProperty()
添加一个新属性到配置中。若是该属性已经存在,其它值被添加到它(所以它变成一个多值属性)。
clearProperty()
从配置删除指定属性。
setProperty()
覆盖指定属性的值。这和删除属性而后调用带有新属性值的addProperty()相同。
clear()
清空配置。
Commons Configuration类库提供的大多数实现Configuration接口的类,例如,它们容许客户端代码改变它们的内部状态。对于一些使用状况,这可能不理想。例如,一个应用程序可能想要保护和兴配置对象不收子模块控制完成修改。
转换Configuration对象为ImmutableConfiguration是很简单的方式:只用传入配置到ConfigurationUtils工具类中的unmodifiableConfiguration()方法。这将生产一个包含和原始配置相同数据的不可变配置。
当从多线程访问配置时——它是只读或是操做方式——这个问题在因而否Configuration是否实现线程安全。不可变配置是线程安全的,由于不可变对象能够在多线程中安全共享。然而,ImmutableConfiguration对象经过ConfigurationUtils包装一个可变的Configuration对象建立。所以若是代码持有一个底层Configuration引用,它一直能改变。
由于并发是复杂主题,将在以后专门讲解。