`

【转载】使用Apache Commons Configuration读取配置信息

阅读更多
转载地址:http://my.oschina.net/jack230230/blog/57171
在项目中使用一些比较新的库总会给你带来很多快乐,在这篇文章中,我将会给你介绍一个在Java中读取配置文件的框架——Apache Commons Configuration framework.


你会了解到

    ·从XML文件中获取数据
    ·访问环境变量
    ·连接不同类型的配置信息(基于XML的,基于环境变量的,等等)
    ·在程序改变后自动重新加载配置。

    在我们的示例中将会使用XML文件和环境变量的两种方式存储一个数据库的配置信息(开发、测试、产品,等等)。接下来你将会看到具体的内容,但是首先先配置一下Maven。

Maven设置
我们的示例程序需要在pom.xml文件中添加如下依赖:
<dependencies>
    <dependency>
        <groupId>commons-configuration</groupId>
        <artifactId>commons-configuration</artifactId>
        <version>1.8</version>
    </dependency>
    <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>1.8.0</version>
    </dependency>
    <dependency>
        <groupId>commons-jxpath</groupId>
        <artifactId>commons-jxpath</artifactId>
        <version>1.3</version>
    </dependency>
</dependencies>


简单的数据库配置
    设想我们有一个简单的数据库配置信息存储在XML文件中:

<?xmlversion="1.0"encoding="UTF-8"?>
<!-- const.xml -->
<config>
    <database>
        <url>127.0.0.1</url>
        <port>1521</port>
        <login>admin</login>
        <password>pass</password>
    </database>
</config>


    为了拿到url和port我们用如下的代码:

XMLConfiguration config =new XMLConfiguration("const.xml");
// 127.0.0.1
config.getString("database.url");
// 1521
config.getString("database.port");


    XMLConfiguration是一个Apache Commons类,他可以从指定的配置文件中加载内容,并且提供一个很好的以指定的点的方式得到存储的值。例如例子中的表达式database.port映射到xml文件中的 config/database/port节点的值“1521”。当然还有很多方式获取数据。这里有一些基本的用法:

getBoolean
getByte
getDouble
getFloat
getInt
getInteger
getList
getLong
getStringArray

    你可通过查看Apache Commons的JavaDoc查看更多的使用方式。

将如上配置扩展一步
    设想,过了一会我们想配置多个数据库,我们可以在配置文件中这样写:

<?xmlversion="1.0"encoding="UTF-8"?>

<!-- const.xml -->

<config>
    <databases>
        <database>
            <name>dev</name>
            <url>127.0.0.1</url>
            <port>1521</port>
            <login>admin</login>
            <password>pass</password>
        </database>
        <database>
            <name>production</name>
            <url>192.23.44.100</url>
            <port>1521</port>
            <login>admin</login>
            <password>not-so-easy-pass</password>
        </database>
    </datab
ases>
</config>
    现在我们要访问url数据我们可以这样:

XMLConfiguration config =new XMLConfiguration("const.xml");

// 127.0.0.1
config.getString("databases.database(0).url");

// 192.23.44.100
config.getString("databases.database(1).url");

    你可以看到这次多了参数,0代表第一个,1代表第二个。

XPath表达式
    定点的访问方式没问题,但是只是在一些简单的情况下,对于复杂的真实的状况来讲,我们可能需要使用XPath表达式语言。这里的主要优点是,即便你使用了XML的高级查询,程序看起来仍然比较简洁易懂。

XMLConfiguration config =new XMLConfiguration("const.xml");
config.setExpressionEngine(new XPathExpressionEngine());// 127.0.0.1

config.getString("databases/database[name = 'dev']/url"); 
// 192.23.44.100
config.getString("databases/database[name = 'production']/url");

    这里是上面两个XPath表达式查询的一个解释:

访问环境变量
    在Apache Commons Configuration的帮助下你可以轻松的访问到系统的环境变量。下面是访问系统中ENV_TYPE变量的方法:

EnvironmentConfiguration config =new EnvironmentConfiguration();
config.getString("ENV_TYPE");

    假设变量ENV_TYPE已经设置好了,想看上面的程序是否运行正确,你可以在控制台运行如下脚本:

echo %ENV_TYPE%        # for Windows
# or...
echo $ENV_TYPE         # for Linux/Mac OS

你将会看到ENV_TYPE的值。

联合配置
    让我们总结一下我们了解的东西,下面的getDbUrl方法做如下事情:
    ·检查系统环境变量中叫做ENV_TYPE的值。
    ·如果值是dev或者produtcion就返回相应的数据库url
    ·如果变量没有配置就抛出异常。

public String getDbUrl() throws ConfigurationException {
    EnvironmentConfiguration envConfig =new EnvironmentConfiguration();
    String env = envConfig.getString("ENV_TYPE");
    if("dev".equals(env) ||"production".equals(env)) {
        XMLConfiguration xmlConfig =new XMLConfiguration("const.xml");
        xmlConfig.setExpressionEngine(new XPathExpressionEngine());
        String xpath ="databases/database[name = '"+ env +"']/url";
        return xmlConfig.getString(xpath);
    }else{
        String msg ="ENV_TYPE environment variable is "+
                     "not properly set";
        throw new IllegalStateException(msg);
    }
}


集中你的配置
    对每个不同的需要配置的对象创建多个配置比较烦。假如我们想添加其他的基于XML的配置,我们会怎么搞?我们需要创建另一个XMLConfiguration对象,这会给管理带来很多麻烦。一个解决办法是把配置文件信息集中到一个单个XML文件中。下面是一个例子:

<?xmlversion="1.0"encoding="UTF-8"?>
<!-- config.xml -->
<configuration>
  <env/>
  <xmlfileName="const.xml"/>
</configuration>

    你需要使用DefaultConfigurationBuilder类,最终版本的getDbUrl方法看起来像这样:

public String getDbUrl()throws ConfigurationException {
    DefaultConfigurationBuilder builder =
        new DefaultConfigurationBuilder("config.xml");
    boolean load =true;
    CombinedConfiguration config = builder.getConfiguration(load);
    config.setExpressionEngine(new XPathExpressionEngine());
    String env = config.getString("ENV_TYPE");
    if("dev".equals(env) ||"production".equals(env)) {
        String xpath ="databases/database[name = '"+ env +"']/url";
        return config.getString(xpath);
    }else{
        String msg ="ENV_TYPE environment variable is "+
                     "not properly set";
        throw new IllegalStateException(msg);
    }
}


自动重新加载
    Apache Commons Configuration有很多非常酷的特性。其中一个就是当基于文件的配置变化的时候自动加载,因为我们可以设置加载策略。框架会轮询配置文件,当文件的内容发生改变时,配置对象也会刷新。你可以用程序控制:

XMLConfiguration config =new XMLConfiguration("const.xml");
ReloadingStrategy strategy =new FileChangedReloadingStrategy();
strategy.setRefreshDelay(5000);
config.setReloadingStrategy(strategy);

    或者把他写到主配置文件中:

<?xmlversion="1.0"encoding="UTF-8"?>

<!-- config.xml -->

<configuration>
  <env/>
  <xmlfileName="const.xml">
    <reloadingStrategyrefreshDelay="5000"
      config-class="org.apache.commons.configuration.reloading.FileChangedReloadingStrategy"/>
  </xml>
</configuration>

    每五秒框架都检查一下配置文件有没有改变。

最后
    我个人用来管理需要配置的代码的时候的选择是使用Apache Commons。我希望这篇文章可以让你相信这个框架可以提供一个非常有用的接口用来访问你的静态数据。最后需要说的一点,这篇文章的内容只是这个框架的功能的一部分。此框架一些其他的有趣的功能是:
    ·从不同的数据源装载配置信息,例如properties文件、ini文件、数据库等等。
    ·给配置对象增加新的属性,并把它回存到文件中。
    ·监听配置对象改变的事件。(这点可以让你在配置发生改变的时候及时作出处理)
    ·自动解析配置文件的实际路径(不管你是把它放在程序文件夹下还是一个jar中。)
分享到:
评论

相关推荐

    apache commons configuration 学习

    Apache Commons Configuration 是一个强大的 Java 库,它简化了应用程序中配置文件的处理工作。这个库允许开发者以灵活的方式读取和管理不同格式的配置文件,包括但不限于 `.properties`、`.xml`、`.ini` 和从 JNDI...

    Configuration对properties、xml配置文件的【增删改查】及动态加载

    在`configurationDemo`文件中,可能包含了一个简单的Java应用,该应用展示了如何使用Apache Commons Configuration库进行配置文件的【增删改查】操作以及动态加载。通过运行这个案例,我们可以更直观地理解这些功能...

    Apache-Configuration-Demo:Apache Commons Configuration 2学习

    Apache Commons Configuration 是一个流行的 Java 库,用于处理应用程序的配置设置。这个库为开发者提供了灵活的方式来管理和读取配置数据,可以是从文件、系统属性、环境变量或是其他来源获取。Apache Commons ...

    org.apache.commons.configuration.XMLConfiguration的读取范例

    Apache Commons Configuration 是一个Java库,它提供了一组高级配置接口和类,用于处理应用程序的配置文件。在这些接口中,`XMLConfiguration` 是一个重要的组件,专门设计用来处理XML格式的配置文件。在这个范例中...

    commons-configuration2-2.0.jar

    commons-configuration2-2.0.jar Apache commons-configuration 读取配置文件

    Apache的Commons-configuration自动加载特性

    在"Apache的Commons-configuration自动加载特性"中,我们将探讨这个库如何简化配置文件的读取和管理,并特别关注其自动加载功能。 自动加载特性是Apache Commons Configuration的一个强大功能,它允许程序在运行时...

    官方commons-configuration-1.10的jar包

    8. **XML配置的解析**:对于XML配置文件,Commons Configuration 使用DOM解析器来读取数据,支持XPath表达式,可以方便地定位和操作XML文档中的元素。 9. **安全处理**:考虑到配置信息可能包含敏感数据,如密码,...

    commons-configuration代码实例

    通过使用 Apache Commons Configuration,开发者可以轻松地处理各种配置文件,提高代码的可维护性和灵活性。学习并熟练掌握这个库对于编写健壮、易于管理的 Java 应用程序至关重要。在实际项目中,你可以根据需求...

    Apache Commons API.rar

    它支持多种配置源,如XML、INI文件、系统属性、环境变量等,提供了一种灵活的方式来读取和管理配置信息。`Configuration`接口是其核心,提供了添加、获取和删除配置键值对的方法。此外,它还支持监听配置的变化,...

    commons-configuration-1.10.jar

    1. **配置接口**:Apache Commons Configuration的核心是`Configuration`接口,它定义了读写配置信息的一系列方法。这个接口允许你像操作普通的Java集合一样操作配置项,比如添加、删除、获取键值对。 2. **多源...

    org.apache.commons jar

    8. **Apache Commons Configuration**: 提供了灵活的配置文件处理,可以读取 XML、INI、系统属性等多种格式的配置文件。 9. **Apache Commons JCI**: 用于Java编译器接口,可以帮助你在运行时动态编译 Java 代码。 ...

    加载配置文件的方式(java[Properties,InputStream]与apache-commons-configuration组件)

    本篇文章将探讨两种主流的加载配置文件的方法:使用Java内置的`Properties`类和Apache Commons Configuration组件。同时,我们还将简要了解这两个方法的工作原理和优缺点。 1. **Java内置的Properties类** `java....

    commons-configuration2-2.1-bin.zip

    Apache Commons Configuration 是一个Java库,专门用于处理各种配置文件和属性。这个库为开发者提供了方便的方式来管理和解析配置数据,无论是简单的键值对格式(如.properties文件)还是更复杂的XML文件。"commons-...

    apache-commons源码及jar文件

    Commons-Configuration 工具对各种各式的配置和参考文件提供读取帮助. Daemon 一种 unix-daemon-like java 代码的替代机制 DBCP Commons-DBCP 提供数据库连接池服务 DbUtils DbUtils 是一个 JDBC helper 类库,...

    commons-configuration

    Apache Commons Configuration 是一个Java库,专门用于处理配置文件和提供灵活的访问配置数据的API。这个库被设计成模块化和可扩展的,允许开发者在各种各样的应用场景中轻松地处理配置参数。"commons-configuration...

    java读取配置文件

    以下是如何使用 Commons Configuration 的 `XMLConfiguration` 类来解析 XML 配置文件: ```java import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration....

    Apache Commons工具集简介

    **Apache Commons Configuration** 是一个强大的配置管理工具,支持多种配置文件格式,如Properties文件、XML文档、JNDI等。 - **多格式支持**: 支持多种配置文件格式,可以根据实际需求选择最合适的格式。 - **...

    Apache Commons 工具类介绍及简单使用 (2).pdf

    通过使用 Configuration,可以轻松地将应用程序的配置信息存储到文件中,并且可以根据需要读取配置信息。 DBCP DBCP 是 Apache Commons 中的一个工具类,提供了数据库连接池服务。通过使用 DBCP,可以轻松地将...

    apache-commons的所有API

    4. **Commons Configuration**: 用于读取和管理配置文件,支持 XML、INI、属性文件等多种格式。可以方便地获取和修改配置项,如 `Configuration` 接口和 `PropertyPlaceholderConfigurer` 类。 5. **Commons IO**: ...

    Apache Commons书籍

    9. **Apache Commons Configuration**:提供了一种灵活的方式来管理和处理配置数据,可以是XML、属性文件、系统属性等多种形式。 10. **Apache Commons Logging**:是一个轻量级的日志抽象层,允许在运行时选择不同...

Global site tag (gtag.js) - Google Analytics