PropertyPlaceholderConfigurer是BeanFactoryPostProcessor的子類。mysql
一般狀況下,咱們不想將相似於系統管理相關的信息同業務對象相關的配置信息混雜到XML配置文件中,以避免部署或維護期間由於改動複雜的XML配置文件而出現問題。咱們會將一些數據庫鏈接信息、郵件服務器等相關信息單獨配置到一個properties文件中,這樣,若是因系統資源變更的話,只須要關注這些簡單的properties配置文件便可。sql
PropertyPlaceholderConfigurer容許咱們在XML配置文件中使用佔位符,並將這些佔位符所表明的資源單獨配置到簡單的properties文件中加載。以數據庫的配置爲例,使用了PropertyPlaceholderConfigurer以後,能夠在XML配置文件中使用佔位符配置數據源,而不用將鏈接地址、用戶名和密碼等都配置到XML中。數據庫
XML配置示例以下:apache
1 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 2 <property name="url"> 3 <value>${jdbc.url}</value> 4 </property> 5 <property name="driverClassName"> 6 <value>${jdbc.driver}</value> 7 </property> 8 <property name="username"> 9 <value>${jdbc.username}</value> 10 </property> 11 <property name="password"> 12 <value>${jdbc.password}</value> 13 </property> 14 <property name="testOnBorrow"> 15 <value>true</value> 16 </property> 17 <property name="testOnReturn"> 18 <value>true</value> 19 </property> 20 <property name="testWhileIdle"> 21 <value>true</value> 22 </property> 23 <property name="minEvictableIdleTimeMillis"> 24 <value>180000</value> 25 </property> 26 <property name="timeBetweenEvictableRunsMillis"> 27 <value>360000</value> 28 </property> 29 <property name="validationQuery"> 30 <value>SELECT 1</value> 31 </property> 32 <property name="maxActive"> 33 <value>100</value> 34 </property> 35 </bean>
如今全部這些佔位符所表明的資源,都放到了jdbc.properties文件中,以下所示:服務器
jdbc.url = jdbc:mysql://server/MAIN?useUnicode=true&characterEncoding=ms92&failOverReadOnly=false&roundRobinLoadBalance=true jdbc.driver = com.musql.jdbc.Driver jdbc.username = your username jdbc.password = your password
BeanFactory在第一階段加載完成全部配置信息時,BeanFactory中保存的對象的屬性信息還只是以佔位符的形式存在。當其進入容器實現的第二階段實例化bean時,bean定義中的屬性值將被properties文件中的配置信息所替換。url
PropertyPlaceholderConfigurer不單會從其配置的properties文件中加載配置項,同時還會檢查Java的System類中的Properties,能夠經過setSystemPropertieMode()或者setSystemPropertiesModeName()來控制是否加載或覆蓋System相應Properties的行爲。PropertiesPlaceholderConfigurer提供了SYSTEM_PROPERTIES_MODE_FALLBACK、SYSTEM_PROPERTIES_MODE_NEVER和SYSTEM_PROPERTIES_MODE_OVERRIDE三種模式。默認採用的是SYSTEM_PROPERTIES_MODE_FALLBACK,即若是properties配置文件中找不到相應的配置項,則到System的Properties中查找,咱們還能夠選擇不檢查System的Properties或者覆蓋它。spa
本文摘抄自《Spring 揭祕》。code