在項目中使用一些比較新的庫總會給你帶來不少快樂,在這篇文章中,我將會給你介紹一個在Java中讀取配置文件的框架——Apache Commons Configuration framework.
數據庫
你會了解到apache
·從XML文件中獲取數據 框架
·訪問環境變量 測試
·鏈接不一樣類型的配置信息(基於XML的,基於環境變量的,等等) ui
·在程序改變後自動從新加載配置。url
在咱們的示例中將會使用XML文件和環境變量的兩種方式存儲一個數據庫的配置信息(開發、測試、產品,等等)。接下來你將會看到具體的內容,可是首先先配置一下Maven。
spa
咱們的示例程序須要在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表達式語言。這裏的主要優勢是,即使你使用了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"
);
|
在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中。)