摘要:本文
深入探討了配置化文件(即.properties)的普遍應用方式
。包括了Spring、一般的、遠程的三種使用方案。
關鍵詞:.properties, Spring, Disconf, Java
解決問題:如何正確使用.properties配置文件。
若是有其他代碼需要此Spring屬性配置,
將Spring配置中的屬性值設置遷移到外部的屬性文件中,是必需的操作,這也可以使Spring配置文件更易讀。在這里
我們
不僅要討論Spring的外部化配置,還要深入探討配置化文件(即.properties)的普遍應用方式。
這樣就可以在不用重新打包和重新部署應用的情況下,配置這些屬性值
。從
開發過程來看,將通用變量提出,並可配,也是寫出高可讀、低耦合代碼的必然途徑。
從結果來看,這對於靈活性地進行測試、運維工作,是非常有好處的。在開發時,我們盡量把部署時需要修改的信息提出放在文件中,方便部署人員部署。一個大型系統中,多個項目有相同的配置信息,則部署人員部署時需要對多個不同的文件修改相同的信息,這不是好的代碼結構,麻煩部署人員的同時,也增加了犯錯的可能性。下面,就是針對以上問題的解決方案。
一、原先的Spring配置
下面是普通的Spring配置文件。可以看出,這里的value可以提出,以供其它代碼重用。
<bean
id
=
"IndexHandler"
name
=
"IndexHandler"
class
=
"wang.anqi.util.IndexHandler"
>
<property name = "solrUrl" value = "http://192.8.125.30:8983/solr/core0" />
</bean>
<property name = "solrUrl" value = "http://192.8.125.30:8983/solr/core0" />
</bean>
二、經過改良后的配置
1、Spring配置
下面是引入了兩個配置文件db.properties和solr.properties后的Spring配置文件。
<bean
class
=
"org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
>
<property name="locations">
<list>
<value>classpath:db.properties</value>
<value>classpath:solr.properties</value>
</list>
</property>
</bean>
<list>
<value>classpath:db.properties</value>
<value>classpath:solr.properties</value>
</list>
</property>
</bean>
<bean id="IndexHandler" name="IndexHandler" class="wang.anqi.util.IndexHandler">
<property name="solrUrl" value= ${solr.url} />
<property name="solrUrl" value= ${solr.url} />
</bean>
以下是配置文件
db.properties
db.ip
=
192
.
8
.
125
.
201
db.name = aitanjupt
db.url = jdbc : mysql : //${db.ip}:3306/${db.name}
db.username = root
db.password = 1234
db.name = aitanjupt
db.url = jdbc : mysql : //${db.ip}:3306/${db.name}
db.username = root
db.password = 1234
配置文件solr.properties
solr.url
=
http
:
//192.8.125.30:8983/solr/core0
2、使用@Value注解來獲取配置
屬性占位符配置的作用不限於XML中的Bean屬性配置。還可以用它來配置@Value注解的屬性。
public
class
IndexHandler
{
@Value( "${solr.url}" )
private String solrUrl;
}
{
@Value( "${solr.url}" )
private String solrUrl;
}
然而這種方式使用起來並不十分方便。你需要先在類里面申明一個屬性。
3、使用ResourceBundle來讀取配置
-
privatestaticString myValue; static{ try{ ResourceBundle bundle =ResourceBundle .getBundle(PROPERTIES_FILE_NAME,Locale.ENGLISH);//PROPERTIES_FILE_NAME可以是solr.properties文件名的一部分:"solr" myValue = bundle.getString(MY_VALUE_KEY).trim();//MY_VALUE_KEY可以是solr.url } catch(Exception ex){ System.err.println("[Property]:Can't Load property.properties"); myValue ="default value"; System.out.println("myValue will use the default value: "+ myValue); } }
-
這種方式使用起來比較方便。
三、
遠程
讀取配置文件
只是通過以上方式來管理配置,尚覺不足。在一個比較大的系統中,很有可能多個子系統都需要使用相同配置的情況,當然,你可以將這些配置記入數據庫中並提供接口,自己管理起來。但是如果需要實時地將配置信息推送到不同的子系統中,情況就更將復雜了。
可以
采用
Disconf作為分布式配置管理平台,D
isconf是一套完整的基於zookeeper的分布式配置統一解決方案。支持配置(配置項+配置文件)的分布式化管理,配置發布統一化,極
簡的使用方式(注解式編程 或 XML代碼無代碼侵入模式),
低侵入性或無侵入性、強兼容性,
需要Spring編程環境
。
其依賴於:
Mysql、
Tomcat、
Nginx、
zookeeeper
、
Redis
。
Disconf的缺陷在於安全問題,無需帳號登陸就可以下拉、下載各Properties。
更多詳細介紹請移步 https://github.com/knightliao/disconf
