在項目中使用一些比較新的庫總會給你帶來很多快樂,在這篇文章中,我將會給你介紹一個在Java中讀取配置文件的框架——Apache Commons Configuration framework.
你會瞭解到
·在程序改變後自動重新加載配置。
Maven設置
<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>
簡單的數據庫配置
<?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>
XMLConfiguration config =new XMLConfiguration("const.xml");
// 127.0.0.1
config.getString("database.url");
// 1521
config.getString("database.port");
getBoolean
getByte
getDouble
getFloat
getInt
getInteger
getList
getLong
getStringArray
將如上配置擴展一步
<?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>
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");
XPath表達式
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");
訪問環境變量
EnvironmentConfiguration config =new EnvironmentConfiguration();
config.getString("ENV_TYPE");
echo %ENV_TYPE% # for Windows
# or...
echo $ENV_TYPE # for Linux/Mac OS
聯合配置
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);
}
}
集中你的配置
<?xmlversion="1.0"encoding="UTF-8"?>
<!-- config.xml -->
<configuration>
<env/>
<xmlfileName="const.xml"/>
</configuration>
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);
}
}
自動重新加載
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>
最後
·自動解析配置文件的實際路徑(不管你是把它放在程序文件夾下還是一個jar中。)