天天看點

PropertyPlaceholderConfigurer淺談Spring的PropertyPlaceholderConfigurer

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