区别描述
-
PropertyPlaceholderConfigurer
- 功能 : 解析和处理
bean
定义中属性值,构造函数参数值,和@Value
注解中的占位符${...}
- 属性源 : 所设置的
Properties
属性对象,属性文件,系统属性(system properties
),环境变量(environment variables
) - 工作模式 : “拉”,遍历每个
bean
定义中的属性占位符,从属性源中拉取对应的属性值替换属性占位符
从
Spring 3.1
开始,推荐使用PropertySourcesPlaceholderConfigurer
而不是PropertyPlaceholderConfigurer
。 - 功能 : 解析和处理
-
PropertyOverrideConfigurer
- 功能 : 基于属性文件定义的
bean
属性值设置指令执行相应的bean
属性值设置 - 属性源 : 指定路径的属性文件
- 工作模式: “推”,根据属性文件中的
bean
属性设置指令将属性值推送设置到相应的bean
属性
- 功能 : 基于属性文件定义的
例子演示
1. PropertyPlaceholderConfigurer
例子
- 提供一个配置文件,比如为
database.properties
:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mydb
jdbc.username=root
jdbc.password=password
- 定义
bean PropertyPlaceholderConfigurer
如下 :
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>database.properties</value>
</property>
</bean>
- 然后定义
bean dataSource
如下 :
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<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>
经过上面三个步骤,bean dataSource
定义效果同下 :
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mydb" />
<property name="username" value="root" />
<property name="password" value="password" />
<property name="systemPropertiesMode" value="0" />
</bean>
2. PropertyOverrideConfigurer
例子
- 提供一个配置文件,比如为
myproperties.properties
:
person.age=40
person.name=Stanis
- 定义
bean PropertyOverrideConfigurer
如下 :
<bean class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
<property name="location" value="classpath:myproperties.properties" />
</bean>
- 然后定义
bean person
如下 :
<bean id="person" class="com.sample.Employee" >
<property name="name" value="Dugan"/>
<property name="age" value="50"/>
</bean>
经过上述三个步骤,当我们在程序中访问bean person
的属性时会有如下结果 :
Employee e = (Employee)context.getBean(Employee.class);
e.getAge() // 这里会对应属性文件 myproperties.properties 中的属性值 40
e.getName() // => 这里会对应属性文件 myproperties.properties 中的属性值 "Stanis"