Spring 后置處理器 PropertyPlaceholderConfigurer 類(引用外部文件)


一、PropertyPlaceholderConfigurer類的作用

PropertyPlaceholderConfigurer 是 BeanFactory 后置處理器的實現,也是 BeanFactoryPostProcessor 接口的一個實現。允許將上下文(配置文件)中的屬性值放在另一個單獨的標准 JavaProperties 文件中去。在 XML 文件中用類似 EL 表達式的 ${key} 替換指定的 properties 文件中的值。這樣的話,以后更改參數時,我們直接替換 properties 文件中的值就可以了。

 

二、在配置文件中如何使用這個類呢?

1. 在 Spring 中,使用 PropertiesPlaceholderConfigurer 在 XML 配置文件中引入外部屬性文件,還可以指定編碼格式。

<bean id="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
        <value>jdbc.properties</value>
    </property>
    <property name="fileEncoding">
        <value>UTF-8</value>
    </property>
</bean>

當有多個屬性文件時

<bean id="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>/WEB-INF/db.properties</value>
            <!-- 注意這兩種value值的寫法 -->
            <value>classpath: jdbc.properties</value>
        </list>
    </property>
</bean>

2. 創建標准的 JavaProperties 文件 jdbc.properties

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/mysqldb?useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=round;
jdbc.username=root
jdbc.password=123456

3. 在 Spring 配置文件中使用引入的外部文件中的值

一個簡單的數據源:使用 ${} 調用

<bean id="dataSource"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close">
    <property name="driverClassName"value="${jdbc.driverClass}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}"/>
    <property name="password"value="${jdbc.password}" />
</bean>

PropertyPlaceholderConfigurer 起的作用就是將占位符指向的數據庫配置信息放在 bean 中定義的工具。

 

三、使用時的兩點注意事項

1. PropertyPlaceholderConfigurer 默認在指定的 properties 文件中找不到你需要的屬性,它還會在 Java 的 System 類屬性中查找。

我們可以通過如下方法給 Spring 配置文件傳遞參數

System.setProperty(key, value);

這種默認行為也可以通過 systemPropertiesModeName 或者 systemPropertiesModel 參數來改變。

PropertyPlaceholderConfigurer 類為我們提供了三種模式。

  • SYSTEM_PROPERTIES_MODE_NEVER: 只允許在 properties 文件中查找,不允許去System類中查找。
  • SYSTEM_PROPERTIES_MODE_FALLBACK: 默認模式。
  • SYSTEM_PROPERTIES_MODE_OVERRIDE: 優先 System 類中查找,找不到再去 properties 文件中查找,與默認模式正好相反。
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <!-- 優先在System類中查找 -->
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="locations">
        <list>
            <value>classpath*:/jdbc.properties</value>
        </list>
    </property>
</bean>

 

2. Spring2.5 以后,引入了簡化的引入外部文件的方式,如下:

<context:property-placeholder location="classpath:db.properties"/>

location 屬性定義在 PropertyPlaceholderConfigurer 的祖宗類 PropertiesLoaderSupport 中,並且只有 setter 方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM