PropertyPlaceholderConfigurer是BeanFactoryPostProcessor的子类。
通常情况下,我们不想将类似于系统管理相关的信息同业务对象相关的配置信息混杂到XML配置文件中,以免部署或维护期间因为改动复杂的XML配置文件而出现问题。我们会将一些数据库连接信息、邮件服务器等相关信息单独配置到一个properties文件中,这样,如果因系统资源变动的话,只需要关注这些简单的properties配置文件即可。
PropertyPlaceholderConfigurer允许我们在XML配置文件中使用占位符,并将这些占位符所代表的资源单独配置到简单的properties文件中加载。以数据库的配置为例,使用了PropertyPlaceholderConfigurer之后,可以在XML配置文件中使用占位符配置数据源,而不用将连接地址、用户名和密码等都配置到XML中。
XML配置示例如下:
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文件中的配置信息所替换。
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或者覆盖它。
本文摘抄自《Spring 揭秘》。