淺談Spring的PropertyPlaceholderConfigurer
大型項目中,我們往往會對我們的系統的配置資訊進行統一管理,一般做法是将配置資訊配置與一個cfg.properties的檔案中,然後在我們系統初始化的時候,系統自動讀取cfg.properties配置檔案中的key value(鍵值對),然後對我們系統進行定制的初始化。
那麼一般情況下,我們使用的java.util.Properties,也就是java自帶的。往往有一個問題是,每一次加載的時候,我們都需要手工的去讀取這個配置檔案,一來編碼麻煩,二來代碼不優雅,往往我們也會自己建立一個類來專門讀取,并儲存這些配置資訊。
但是,在于我看來,這些原本Spring就有的東西,你還自己重複造輪子,費功夫。而且未必沒有那麼友善維護和管理更新。用起來的通用性比較差,各個企業有各個企業的開發規範,這樣子一來,學習成本也提高。(這個是廢話)。
Spring中提供着一個PropertyPlaceholderConfigurer
這個類是BeanFactoryPostProcessor的子類。(不懂自己度娘,可了解可不了解,下面我會講大概)
其主要的原理在是。Spring容器初始化的時候,會讀取xml或者annotation對Bean進行初始化。初始化的時候,這個PropertyPlaceholderConfigurer會攔截Bean的初始化,初始化的時候會對配置的${pname}進行替換,根據我們Properties中配置的進行替換。進而實作表達式的替換操作 。
了解完原理之後,我們來看其實作的幾種方式。
在我們的classpath下建立一個cfg.properties
#cfg.properties配置檔案的内容
username=jay
password=123
下面是Spring配置檔案代碼
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<!-- 對于讀取一個配置檔案采取的方案 -->
<property name="location" value="classpath:cfg.properties"></property>
<!-- 對于讀取兩個以上配置檔案采取的處理方案 -->
<!--
<property name="locations">
<list>
<value>classpath:cfg.properties</value>
<value>classpath:cfg2.properties</value>
</list>
</property>
-->
</bean>
</beans>
//測試代碼
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationCtx.xml")
public class SpringCtxTst {
@Value("${username}")
private String uname;
@Value("${password}")
private String pwd;
@Test
public void test(){
System.out.println("username:"+uname);
System.out.println("password:"+pwd);
}
}
控制台輸出
username:jay
password:123
當然,Spring 為此也為我們提供了另外一個的解決方案,我們直接在Spring 配置檔案中書寫如下代碼即可實作
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<!--采用這種方式簡化配置檔案-->
<context:property-placeholder location="classpath:cfg.properties,classpath:cfg2.properties"/>
</beans>
重要注意
我們知道,不論是使用PropertyPlaceholderConfigurer還是通過context:property-placeholder這種方式進行實作,都需要記住,Spring架構不僅僅會讀取我們的配置檔案中的鍵值對,而且還會讀取Jvm 初始化的一下系統的資訊。有時候,我們需要将配置Key定一套命名規則 ,例如
項目名稱.組名.功能名=配置值
org.team.tfunction=0001
這種方式來盡量減少與系統配置資訊的沖突!
同時,我們也可以使用下面這種配置方式進行配置,這裡我配NEVER的意思是不讀取系統配置資訊。如果
<context:property-placeholder location="classpath:cfg.properties,classpath:cfg2.properties" system-properties-mode="NEVER"/>