spring 使用 context:property-placeholder 加載 多個 properties

通常使用PropertyPlaceholderConfigurer來替換佔位符,例如:spring

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="locations">
      <value>classpath:com/foo/strategy.properties</value>
  </property>
  <property name="properties">
      <value>custom.strategy.class=com.foo.DefaultStrategy</value>
  </property>
</bean>

spring 2.5以後,可使用spa

<context:property-placeholder location="classpath:com/foo/jdbc.properties"/>

其本質是註冊了一個PropertyPlaceholderConfigurer(3.1以前)或者是PropertySourcesPlaceholderConfigurer(3.1以後)ip

Tip:開發

 

PropertyPlaceholderConfigurer內置的功能很是豐富,若是它未找到${xxx}中定義的xxx鍵,它還會去JVM系統屬性(System.getProperty())和環境變量(System.getenv())中尋找。經過啓用systemPropertiesMode和searchSystemEnvironment屬性,開發者可以控制這一行爲。get

而PropertySourcesPlaceholderConfigurer在此基礎上會和Environment and PropertySource配合更好。it

另外須要注意如下幾點io

一、在PropertyPlaceholderBeanDefinitionParser的父類中shouldGenerateId返回true,即默認會爲每個bean生成一個惟一的名字; 若是使用了兩個<context:property-placeholder則註冊了兩個PropertySourcesPlaceholderConfigurer Bean;因此不是覆蓋(並且bean若是同名是後邊的bean定義覆蓋前邊的); 
二、PropertySourcesPlaceholderConfigurer本質是一個BeanFactoryPostProcessor,spring實施時若是發現這個bean實現了Ordered,則按照順序執行;默認無序; 
三、此時若是給<context:property-placeholder加order屬性,則會反應出順序,值越小優先級越高即越早執行; 
好比 
   <context:property-placeholder order="0" location="classpath:dbconfig.properties"/>  
   <context:property-placeholder order="1" location="classpath*:conf/conf_a.properties"/>  
   <context:property-placeholder order="2" location="classpath*:conf/conf_b.properties"/> 
此時會先掃描order='1' 的,若是沒有掃描order='2'的 
四、默認狀況下ignore-unresolvable;即若是沒找到的狀況是否拋出異常。默認false:即拋出異常; 
<context:property-placeholder location="classpath*:conf/conf_a.properties" ignore-unresolvable="false"/>class

相關文章
相關標籤/搜索