8.1.4 属性占位符配置器

8.1.4 属性占位符配置器

Spring提供了PropertyPlaceholderConfigurer,它是一个容器后处理器,负责读取Properties属性文件里的属性值,并将这些属性值设置成Spring配置文件的数据。
通过使用PropertyPlaceholderConfigurer后处理器,可以将Spring配置文件中的部分数据放在属性文件中设置,这种配置方式当然有其优势:可以将部分相似的配置(比如数据库的URL、用户名和密码)放在特定的属性文件中,如果只需要修改这部分配置,则无须修改Spring配置文件,修改属性文件即可。

程序示例

1
2
3
4
5
6
7
E:\workspace_QingLiangJiJavaEEQiYeYingYongShiZhang5\PropertyPlaceholderConfigurer
├─data.sql
└─src\
├─beans.xml
├─dbconn.properties
└─lee\
└─BeanTest.java

beans.xml

下面的配置文件配置了PropertyPlaceholderConfigurer后处理器,在配置数据源Bean时,使用了属性文件中的属性值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="GBK"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- PropertyPlaceholderConfigurer是一个容器后处理器,
它会读取 属性文件信息,并将这些信息设置成Spring配置文件的数据。 -->
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>dbconn.properties</value>
<!-- 如果有多个属性文件,依次在下面列出来 -->
<!--value>wawa.properties</value -->
</list>
</property>
</bean>
<!-- 定义数据源Bean,使用C3P0数据源实现 -->
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close"
p:driverClass="${jdbc.driverClassName}"
p:jdbcUrl="${jdbc.url}"
p:user="${jdbc.username}"
p:password="${jdbc.password}" />
</beans>

在上面的配置文件中,配置driverClassjdbcUrl等信息时,并未直接设置这些属性的属性值,而是设置了${jdbc.driverClassName}${jdbc.url}属性值,这表明Spring容器将从propertyConfigurer指定的属性文件中搜索这些key对应的value,并为该Bean的属性值设置这些value值。
如前所述, ApplicationContext会自动检测部署在容器中的容器后处理器,无须额外注册,容器会自动检测并注册Spring中的容器后处理器。因此,只需提供如下Properties文件:

dbconn.properties

1
2
3
4
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring?useSSL=true
jdbc.username=root
jdbc.password=root

通过这种方法,可从主XML配置文件中分离出部分配置信息。如果仅需要修改数据库连接属性,则无须修改主XML配置文件,只需要修改该属性文件即可。采用属性占位符的配置方式,可以支持使用多个属性文件,通过这种方式,可将配置文件分割成多个属性文件,从而降低修改配置文件产生错误的风险。
对于数据库连接等信息集中的配置,可以将其配置在Properties属性文件中,但不要过多地将Spring配置信息抽离到Properties属性文件中,这样可能会降低Spring配置文件的可读性。

使用context:property-placeholder元素简化配置

对于采用基于XML Schema的配置文件而言,如果导入了context:命名空间,则可采用如下方式来配置该属性占位符。

1
2
<context:property-placeholder
location="classpath:dbconn.properties" />

也就是说,<context:property-placeholder>元素是PropertyPlaceholderConfigurer的简化配置。