注释:此文档属于原英文帮助文档翻译,可能有些不准确或遗漏
一、介绍
我们可以使用Commons Configuration 访问在属性文件和XML文件在存储的内容。Commons Configuration 是为了提供对属性文件、XML文件、JNDI资源、来自JDBC Datasource数据的访问。Commons Configuration 允许我们建立一个分等级的多级配置,在这种多级的配置中,local configuration可以选择性的覆盖默认配置。
二、解析属性配置文件
使用org.apache.commons.configuration包中的PropertiesConfiguration类装载一个属性文件后,可以提供对于number、arrays、list的访问,下面的例子包括了3个属性,speed 是一个浮点数NUMBER,name是一个用逗号分隔的字符列表,Correct是一个布尔类型。
speed=23.332
names=Bob,Gautam,Jarret,Stefan
correct=false
这个名字为test.properties的属性文件存储在一个应用的工作目录中,现在需要以上面说过的float,List,and boolean方式访问3个属性,以面的代码建了一个PropertiesConfiguration对象,可以访问每个属性。
import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.PropertiesConfiguration; Configuration config = new PropertiesConfiguration( "test.properties" ); float speed = config.getFloat("speed")); List names = config.getList("names")); boolean correct = config.getBoolean("correct");给PropertiesConfiguration构造方法传递的字符串参数指明了属性文件的位置。PropertiesConfiguration比J2SE提供的Properties类有些改进。
<engine-config> <start-criteria> <criteria type="critical"> Temperature Above -10 Celsius </criteria> <criteria> Fuel tank is not empty </criteria> </start-criteria> <name> <first>Tom</first> <last>Payne</last> </name> <horsepower>42</horsepower> </engine-config>这个XML配置文件的内容可以被commons 提供的的的DOMConfiguration类加载,DOMConfiguration类使用Xerces XML 解析器把全部的XML文件解析为DOM 文件,,可以参照下面的实现:
import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.DOMConfiguration; String resource = "com/discursive/jccook/configuration/global.xml"; Configuration config = new DOMConfiguration(resource); // Retrieve a list of all Criteria elements List startCriteria = config.getList("start-criteria.criteria"); // Retrieve the value of the first criteria element String firstCriteria = config.getString("start-criteria.criteria(0)"); // Retrieve the type attribute of the first criteria element String firstCriteriaType = config.getString("start-criteria.criteria(0)[@type]"); // Retrieve the horsepower as an int int horsepower = config.getInt("horsepower");传一个字符串作为DOMConfiguration 构造方法的参数,DOMConfiguration从类路径中装这载XML文件作为一种资源,如果你需要从file对象中装载XML配置文件,你可以传File object.
DOMConfiguration仅在Xerves XML parser有用的时候(即在类编译路径中有相关类)时可用,如果没有这个JAR包,我们可以利用XMLConfiguration另外的实现类:DOM4JConfiguration,这两种方法使用DOM4J来解析XML文件,当然,这时你需要配置DOM4J的包。
四、形成复合的配置
源码中的解释:属性配置文件根据出现的定义顺序,可以形成覆盖关系。
你的应用要求一个多层的配置(其实是就是多个配置文件,可以选择用那套配置),这样一些默认的属性能被用户定义的或者本地的配置选择性的覆盖。
建立一个configuration.xml文件,这个文件包含了多个属性文件,把这个文件传给ConfigurationFactory. 这个ConfigurationFactory可以返回一个Configuration实现,这个实现包括了多个属性文件的配置参数。
下图是一个包括3层的属性配置文件。
有3个文件来存储不同的配置文件:Example 7-2 (global.properties),Example 7-3 (local.properties),and Example 7-4
Example 7-2. global. properties threads.max=50 threads.min=2 timeout=15.52 interactive=true color=red speed=50 name=Default User Example 7-3. local .properties # Overrides Global Props threads.max=30 speed=55 Example 7-4. user. properties # Overrides Local Props threads.min=1 color=black speed=5000 name=Sean
configuration.xml文件提供了一个配置为ConfigurationFactory,这个文件做为一个资源被存储在类路径中,这个资源的路径用ConfigurationFactory类的setConfigurationURL()方法设置。下面的这个configuration.xml将产生一个Configuration对象,它将会按照XML文件定义的顺序装载属性文件中的属性,如下面的例子:user.properties覆盖local.properties,local.properties 覆盖gloabal.properties.
<?xml version="1.0" encoding="ISO-8859-1" ?> <configuration> <properties fileName="user.properties"/> <properties fileName="local.properties"/> <properties fileName="global.properties"/> </configuration>
import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.ConfigurationFactory; // Configure Factory ConfigurationFactory factory = new ConfigurationFactory( ); URL configURL = this.getClass( ).getResource("configuration.xml"); factory.setConfigurationURL( configURL ); Configuration config = factory.getConfiguration( ); // Print out properties System.out.println( "Timeout: " + config.getFloat("timeout")); System.out.println( "Max Threads: " + config.getString("threads.max")); System.out.println( "Name: " + config.getString("name")); System.out.println( "Speed: " + config.getInt("speed"));上面的代码传递一个configuration.xml资源的URL给ConfigurationFactory,返回一个Configuration实例,它将解析应用配置参数按照上面提到的规则。
输出结果如下:
Timeout: 15.52
Max Threads: 30
Name: Sean
Speed: 75
A configuration.xml file can also instruct a ConfigurationFactory to use a mixture of properties files and XML documents. The following configuration.xml instructs the ConfigurationFactory to create a Configuration instance that looks for properties from a properties file and an XML document:
<?xml version="1.0" encoding="ISO-8859-1" ?> <configuration> <properties fileName="test.properties"/> <dom4j fileName="test.xml"/> </configuration>