使用Apache Commons Configuration读取配置信息

 在项目中使用一些比较新的库总会给你带来不少快乐,在这篇文章中,我将会给你介绍一个在Java中读取配置文件的框架——Apache Commons Configuration framework. 

数据库

你会了解到apache

    ·从XML文件中获取数据 框架

    ·访问环境变量 测试

    ·链接不一样类型的配置信息(基于XML的,基于环境变量的,等等) ui

    ·在程序改变后自动从新加载配置。url

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

spa

Maven设置

咱们的示例程序须要在pom.xml文件中添加以下依赖: .net

?code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
< 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文件中: xml

?

1
2
3
4
5
6
7
8
9
10
<? 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咱们用以下的代码:

?

1
2
3
4
5
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”。固然还有不少方式获取数据。这里有一些基本的用法:

?

1
2
3
4
5
6
7
8
9
getBoolean
getByte
getDouble
getFloat
getInt
getInteger
getList
getLong
getStringArray

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


将如上配置扩展一步

    设想,过了一会咱们想配置多个数据库,咱们能够在配置文件中这样写:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<? 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数据咱们能够这样:

?

1
2
3
4
5
6
7
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的高级查询,程序看起来仍然比较简洁易懂。

?

1
2
3
4
5
6
7
8
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变量的方法:

?

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

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

?

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

你将会看到ENV_TYPE的值。


联合配置

    让咱们总结一下咱们了解的东西,下面的getDbUrl方法作以下事情:

    ·检查系统环境变量中叫作ENV_TYPE的值。

    ·若是值是dev或者produtcion就返回相应的数据库url

    ·若是变量没有配置就抛出异常。

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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文件中。下面是一个例子:

?

1
2
3
4
5
6
<? xmlversion = "1.0" encoding = "UTF-8" ?>
<!-- config.xml -->
< configuration >
   < env />
   < xmlfileName = "const.xml" />
</ configuration >

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

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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有不少很是酷的特性。其中一个就是当基于文件的配置变化的时候自动加载,由于咱们能够设置加载策略。框架会轮询配置文件,当文件的内容发生改变时,配置对象也会刷新。你能够用程序控制:

?

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

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

?

1
2
3
4
5
6
7
8
9
<? 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中。)

相关文章
相关标签/搜索