1. 程式人生 > >淺談Spring的PropertyPlaceholderConfigurer

淺談Spring的PropertyPlaceholderConfigurer

意思 ace erl string nbsp 重要 配置信息 classpath 提高

大型項目中,我們往往會對我們的系統的配置信息進行統一管理,一般做法是將配置信息配置與一個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