淺談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"/>
淺談Spring的PropertyPlaceholderConfigurer