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屬性,開發者能夠控制這一行為。