Commons Configuration之一簡介

1    簡介

Commons Configuration軟件類庫提供通用配置接口,使Java應用程序從多種源讀取配置文件。Commons Configuration提供簡單類型訪問和經過如下代碼演示的多義配置參數:java

Double double = config.getDouble("number");apache

Integer integer = config.getInteger("number");
數組

配置參數能夠從如下源加載:安全

  • Properties文件多線程

  • XML文檔併發

  • Property list文件app

  • JNDI工具

  • JDBC DataSourceui

  • 系統配置編碼

  • Applet參數

  • Servlet參數

Configuration對象使用配置構建起建立。不一樣的配置源可使用CombinedConfigurationBuilderCombinedConfiguration混合使用。可使用擴展AbstractConfigurationAbstractHierarchicalConfiguration的自定義配置對象建立額外的配置參數源。

2    使用Configuration對象

Commons Configuration容許你從各類不一樣的源訪問配置屬性。無論它們以properties文件、XML文檔或JNDI樹存儲,都能經過通用Configuration接口的相同方式訪問。

Commons Configuration的其它優點是能夠混合異構配置源而且像簡單邏輯配置處理。本文將介紹不一樣的配置和如何聯合使用。

2.1    Configuration源

當前有大量Configuration對象的不一樣源。可是,可是隻使用Configuration對象和一個特定類型,像XMLConfigurationJNDIConfiguration,你躲避了實際檢索配置值的機制。這些源包括:

  • PropertiesConfigurationproperties文件加載配置值。

  • XMLConfigurationXML文檔獲取值。

  • INIConfigurationWindows.ini文件加載值。

  • PropertyListConfigurationOpenStep .plist文件加載值。XMLPropertyListConfiguration也能讀取Mac OS X使用的XML變體。

  • JNDIConfiguration使用JNDI樹中的鍵,檢索配置屬性值。

  • BaseConfiguration內存中填充Configuration對象的方法。

  • HierarchicalConfiguration內存中可以處理複雜結構數據的Configuration對象。

  • SystemConfiguration使用系統屬性的配置。

  • ConfigurationConverter須要一個java.util.Properties或一個org.apache.commons.collections.ExtendedProperties並轉換它爲一個Configuration對象。

2.2    混合Configuration源

一般你想要提供一組基本配置值,但容許用戶易於在特定環境覆蓋它們。一種方法是硬編碼默認值到你的代碼中,然而提供一個屬性文件覆蓋它。然而,這時很是死板的事情。使用CompositeConfiguration你能提供許多不一樣的方式設置配置。你能夠手工操做:

CompositeConfiguration config = new CompositeConfiguration();
config.addConfiguration(new SystemConfiguration());
config.addConfiguration(new PropertiesConfiguration("application.properties"));

或者經過ConfigurationFactory類:

ConfigurationFactory factory = new ConfigurationFactory("config.xml");

Configuration config = factory.getConfiguration();

config.xml是上面例子的配置描述符,它指定加載的Configuration對象。下面是描述符的例子:

<?xml version="1.0" encoding="ISO-8859-1" ?>

<configuration>
  <system/>
  <properties fileName="application.properties"/>
</configuration>

這說的是咱們正在加載全部的系統屬性,以及application.properties配置文件。優先順序是從頭至尾。所以,在上面的例子中,若是一個屬性沒有在系統配置中找到,它將在屬性文件中查找。這容許你在配置文件中設置默認值,並使用系統屬性覆蓋它們。

2.3    Configuration接口

該包中的全部類表明共享單個接口Configuration的不一樣種類的配置源。該接口容許你以通用方式訪問和操做配置屬性。

Configuration接口中定義的方法能夠分爲從配置中查詢數據和修改配置對象的方法。實際上,Configuration接口擴展一個基礎接口ImmutableConfigurationImmutableConfiguration定義的 全部方法從配置中讀取數據對象不能改變它的狀態。Configuration添加了操做配置的方法。

定義在ImmutableConfiguration接口中的大部分方法處理不一樣數據類型的屬性檢索。全部這些方法須要一個鍵做爲參數指向指望的屬性。該字符串值明確依賴於具體Configuration實現。它們嘗試經過傳入key查找特定屬性並轉換爲它們的目標類型;轉換值將被返回。全部方法也有重載變體容許指定默認值,若是屬性沒有找到,將返回默認值。支持如下開箱即用的數據類型:

  • BigDecimal

  • BigInteger

  • boolean

  • byte

  • double

  • float

  • int

  • long

  • short

  • String

這些方法的名稱以get開頭後隨它們的數據類型。getString()方法將返回字符串值,getInt()將對整數值起做用。屬性能夠有多個值,所以它也能夠查詢一個包含全部有效值的列表或數組。這使用getList()getArray()方法完成。

此外,有一組通用get方法嘗試轉換請求屬性值到指定數據類型。該轉換也支持集合或數組元素。

若是配置設置組織在特定接口中subset()方法是有用的,而應用程序只對該結構的部分感興趣。subset()傳入key前綴字符串並返回一個Configuration對象只包含鍵開始的前綴。

如下方法能用於操做屬性或它們的值:

addProperty()

添加一個新屬性到配置中。若是該屬性已經存在,其它值被添加到它(所以它變成一個多值屬性)。

clearProperty()

       從配置刪除指定屬性。

setProperty()

覆蓋指定屬性的值。這和刪除屬性而後調用帶有新屬性值的addProperty()相同。

clear()

       清空配置。

2.4    不可變配置

Commons Configuration類庫提供的大多數實現Configuration接口的類,例如,它們容許客戶端代碼改變它們的內部狀態。對於一些使用狀況,這可能不理想。例如,一個應用程序可能想要保護和興配置對象不收子模塊控制完成修改。

轉換Configuration對象爲ImmutableConfiguration是很簡單的方式:只用傳入配置到ConfigurationUtils工具類中的unmodifiableConfiguration()方法。這將生產一個包含和原始配置相同數據的不可變配置。

2.5    線程問題

當從多線程訪問配置時——它是隻讀或是操做方式——這個問題在因而否Configuration是否實現線程安全。不可變配置是線程安全的,由於不可變對象能夠在多線程中安全共享。然而,ImmutableConfiguration對象經過ConfigurationUtils包裝一個可變的Configuration對象建立。所以若是代碼持有一個底層Configuration引用,它一直能改變。

由於併發是複雜主題,將在以後專門講解。

相關文章
相關標籤/搜索