PropertyPlaceholderConfigurer介绍

  • Post author:
  • Post category:其他


PropertyPlaceholderConfigurer是个bean工厂后置处理器的实现,也就是BeanFactoryPostProcessor接口的一个实现。

官方解释是这样的:

A bean factory post-processor is a java class which implements the

org.springframework.beans.factory.config.BeanFactoryPostProcessor interface. It is executed manually  (in the case of the BeanFactory) or automatically (in the case of the ApplicationContext) to apply changes of some sort to an entire BeanFactory, after it has been constructed.

PropertyPlaceholderConfigurer可以将上下文(配置文件)中的属性值放在另一个单独的标准java Properties文件中去。在XML文件中用${key}替换指定的properties文件中的值。这样的话,只需要对properties文件进行修改,而不用对xml配置文件进行修改。

在Spring中,使用PropertyPlaceholderConfigurer可以在XML配置文件中加入外部属性文件,当然也可以指定外部文件的编码,如:

<bean id="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

   <property name="location">

     <value>conf/sqlmap/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/mail.properties</value>  

    <value>classpath:common.properties</value>
    <value>classpath:important.properties</value>//注意这两种value值的写法

   </list>

  </property>

</bean>

JDBC配置

3.譬如,jdbc.properties的内容为:

jdbc.driverClassName=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

4.那么在spring配置文件中,我们就可以这样写:

<bean id="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

  <property name="locations">

   <list>

    <value>classpath: conf/sqlmap/jdbc.properties </value>

   </list>

  </property>

</bean>

<bean id="dataSource"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close">

  <property name="driverClassName"value="${jdbc.driverClassName}" />

  <property name="url" value="${jdbc.url}" />

  <property name="username" value="${jdbc.username}"/>

  <property name="password"value="${jdbc.password}" />

</bean>

指定和忽略某些情况:

指定默认值
我们还可以在定义属性变量时指定对应的默认值。如果指定了属性变量的默认值,则在未找到可用于替换当前属性变量的属性时将使用定义好的默认值来替换当前属性变量。我们在定义属性变量时在变量名后面紧接着就可以指定默认值,默认值与变量名之间以分号隔开,形式如:${varName:defValue},其中varName表示变量名,defValue表示默认值。

	<!-- 指定属性变量maxVal的默认值为100 -->
	<bean id="hello" class="com.app.Hello" p:maxVal="${maxVal:100}" />
属性变量名与默认值之间的分隔符默认是分号“:”,如果有需要用户也可以通过PropertyPlaceholderConfigurer的setValueSeparator()方法进行修改。

	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
		<!-- 指定属性变量名与默认值之间的分隔符为两个分号 -->
		<property name="valueSeparator" value="::"/>
	</bean>
忽略文件未找到
默认情况下我们在通过setLocation()或setLocations()方法指定外部属性文件时,如果对应的文件不存在将抛出异常信息。通过setIgnoreResourceNotFound()方法我们可以设置是否忽略文件未找到的情况,默认为false,即抛出异常信息。如果用户希望忽略对应的错误,则可以设置对应的值为null。

	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
		<property name="location" value="classpath:t12.properties"/> 
		<!-- 指定当外部属性文件不存在时不抛出异常 -->
		<property name="ignoreResourceNotFound" value="true"/>
	</bean>
忽略变量不能解析
默认情况下PropertyPlaceholderConfigurer会把bean定义中所有${varName}形式的定义都当做是一个属性变量定义进行替换。当bean定义中存在形式为${varName}的变量定义但是又不能被PropertyPlaceholderConfigurer利用定义的外部属性文件包含的属性或内部属性定义的属性或环境变量进行替换时,其会抛出异常信息。如果希望在对应的属性变量不能被解析时不抛出异常信息,则可以通过setIgnoreUnresolvablePlaceholders()方法指定ignoreUnresolvablePlaceholders的值为true,这样就将忽略变量不能被解析的情况。

 

	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
		<property name="location" value="classpath:t12.properties"/> 
		<!-- 指定当外部属性文件不存在时不抛出异常 -->
		<property name="ignoreResourceNotFound" value="true"/>
		<!-- 忽略变量不能被解析的情况 -->
		<property name="ignoreUnresolvablePlaceholders" value="true"/>
	</bean>



版权声明:本文为fz13768884254原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。