文档章节

使用Apache Commons Configuration读取配置信息

王振威
 王振威
发布于 2012/05/12 16:28
字数 1515
阅读 17512
收藏 99

    在项目中使用一些比较新的库总会给你带来很多快乐,在这篇文章中,我将会给你介绍一个在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>
    </databases>
</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中。)


OSchina.NET原创翻译/原文链接

© 著作权归作者所有

共有 人打赏支持
王振威

王振威

粉丝 502
博文 28
码字总数 20820
作品 0
深圳
程序员
私信 提问
加载中

评论(13)

高跟男爵
高跟男爵
奇怪我的为啥只能读 不能写·· 比如 clearProperty addProperty 均无效
小甜八
小甜八
楼主好人。。。谢谢分享 正在做的项目 正好用上了 哈哈
Fanxme
Fanxme
非常不错, 简单好用
刘学炜
刘学炜
好帖!!
爱飞的鱼
爱飞的鱼
很nice,学习了。。。
yangkai_2005
yangkai_2005
顶一个。楼主写的很不错!收藏了。
ellan
ellan
很精简!不错!
王振威
王振威

引用来自“zcj”的评论

楼主不早分享,我这两天做一个小项目正好要读配置文件,看libxml2看了好久,用了libxml2的xpath。要是早知道有这么简单的东西可以省多少时间啊。

这..
zcj
zcj
楼主不早分享,我这两天做一个小项目正好要读配置文件,看libxml2看了好久,用了libxml2的xpath。要是早知道有这么简单的东西可以省多少时间啊。
王振威
王振威

引用来自“Bairrfhoinn”的评论

1. “booleanload =true;”应该是“boolean load = true;”,中间的空格少了。
2. “不管你是把它方针程序文件夹下”应该是“不管你是把它放进程序文件夹下”。
用拼音输入法的害处就是容易打出读音相近的字或者词。

谢谢提醒
做数据分析必须了解的获取数据与清洗数据技巧

点击关注 异步图书,置顶公众号 每天与你分享 IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书 ——异步小编 每个数据科学家都需要处理存储在磁盘中的数据,这些数据涉及的格式...

异步社区
05/21
0
0
Tomcat的配置解析工具Apache Commons Digester

开篇  最近开始看Tomcat的源码,在catalina. createStartDigester方法中,Tomcat开发人员采用了Digester来读取conf/server.xml文件,以前读取xml文件一般采用Dom4j和SAX,因此对Digester比较...

晴天哥
10/10
0
0
Java程序员从笨鸟到菜鸟之(五十二)细谈Hibernate(三)Hibernate常用API详解及源码分析

新接触一个框架的目的就是想利用这个框架来为我们做一些工作,或者是让他来简化我们的工作,利用这个框架无非就是要利用这个框架所给我们提供的API去操作我们的数据,所以利用一个框架的好坏...

长平狐
2012/11/12
117
0
MyBatis整合Spring的实现(1)

目的 MyBatis是一个基于Java的持久层框架。也是很多程序员的最爱,因为自己控制的SQL时,写出一个好的SQL会大大的提高整体程序的性能。目前的项目一般都是MyBatis和Spring的整合,那么具体的...

tara_qri
2015/10/24
332
0
.NET Core开发日志——配置

熟悉ASP.NET的开发者一定对web.config文件不陌生。在ASP.NET环境中,要想添加配置参数,一般也都会在此文件中操作。其中最常用的莫过于AppSettings与ConnectionStrings两项。而要在代码中获得...

Ken.W
08/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

追加字节能优化性能

这种方式看起来很神奇,单如果深入理解处理器架构就能理解其中的奥秘。让我们先来看看LinkedTransferQueue这个类,它使用一个内部类型来定义队列的头队列Head和尾节点tail,二这个内部类Pad...

无知的小狼
35分钟前
4
0
性能优化(JVM概念及配置)

虚拟机组成 一次编写,到处运行 Java虚拟机是对操作系统的模拟,隔离差异 2018编程语言排行榜 一个复杂的构架 虚拟机的内部概念 运行原理 编译器,解释器执行流程 内存分配-线程模型 栈帧模型...

这很耳东先生
42分钟前
3
0
Scala之初步认识与环境准备

1. 了解 Scala 1.1. 什么是 Scala Scala 是 Scalable Language 的简写,是一门多范式的编程语言。 Scala设计的初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台(Java虚...

飞鱼说编程
今天
4
0
Vue项目分环境打包的实现步骤

在项目开发中,我们的项目一般分为开发版、测试版、Pre版、Prod版。Vue-cli的默认环境一只有dev和prod两个,之前每次要发布测试版或Pre版都是修改了源码中API地址后打包,这样很麻烦。如果能...

peakedness丶
今天
6
0
vue+lowdb+express

搭建流程: 1.安装Node.js; 2.安装npm; 3.安装Express; 搭建流程 npm install -g express 安装 express 生成器 npm install -g express-generator 查看是否安装成功,随便输的一个命令...

Js_Mei
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部