1. 程式人生 > >Spring讀取外部的.properties檔案內容並設定給bean的兩種方法

Spring讀取外部的.properties檔案內容並設定給bean的兩種方法

在實際開發過程中,將很多屬性是常量的配置或會隨時改變的資訊寫在外部的properties檔案中,然後在程式碼中通過IO流獲取此檔案後在通過Properties類來依次解析其中的內容。
說白了properties檔案的作用是便我們在一個階段內不需要頻繁書寫一個引數的值,而在不同階段間又可以方便的切換引數配置資訊,其中存放的是鍵值對。
但在Spring的配置檔案中不需要這麼繁瑣。Spring封裝了兩個專門讀取外部properties檔案的方法。
以連線資料庫時使用的url,username,password,driverClass…為例
將這些資訊全部寫在類路徑下的db.properties檔案中:

jdbc.user=root
jdbc.password=toor
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql:///abc
jdbc.initPoolSize=5
jdbc.maxPoolSize=10

方法一 (在spring的配置檔案中加入如下內容) :

<context:property-placeholder location="classpath:db.properties"/>
//location值為引數配置檔案的位置,這裡是在類路徑下

這樣一來就可以為spring配置的bean的屬性設定值了,比如配置c3p0連線池:

<bean id="dataSource"
        class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="${jdbc.user}"></property>
        <property name="password" value="${jdbc.password}"></property>
        <property name="jdbcUrl" value="${jdbc.jdbcUrl}"
></property> <property name="driverClass" value="${jdbc.driverClass}"></property> <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property> <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property> </bean>

方法二:(在spring容器中宣告一個類org.springframework.beans.factory.config.PropertyPlaceholderConfigurer)

 <bean
  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
               <value>classpath:db.properties</value>
             </list>
        </property>
    </bean>

這樣同樣也可以把db.properties匯入進來,而且我們可以看到這種方法可以同時匯入多個檔案進來。匯入進來後使用方法於上面一樣。

PropertyPlaceholderConfigurer實現了BeanFactoryPostProcessor介面,它能夠對<bean/>中的屬性值進行外在化管理。故此種的配置方法也叫”外在化應用引數的配置”…

PropertyPlaceholderConfigurer內建的功能非常豐富,如果它未找到${xxx}中定義的xxx鍵,它還會去JVM系統屬性(System.getProperty())和環境變數(System.getenv())中尋找。通過啟用systemPropertiesMode和searchSystemEnvironment屬性,開發者能夠控制這一行為。