8.1.5 重写占位符配置器
PropertyOverrideConfigurer
是Spring
提供的另一个容器后处理器,这个后处理器的作用比上面那个容器后处理器的功能更加强大。PropertyOverrideConfigurer
的属性文件指定的信息可以直接覆盖Spring
配置文件中的元数据。
如果PropertyOverrideConfigurer
的属性文件指定了一些配置的元数据,则这些配置的元数据将会覆盖原配置文件里相应的数据。在这种情况下,可以认为Spring
配置信息是XML
配置文件和属性文件的总和,当XML
配置文件和属性文件指定的元数据不一致时,以属性文件的信息为准。
使用PropertyOverrideConfigurer
的属性文件,每条属性应保持如下的格式:beanId.property=value
beanId
是属性占位符试图覆盖的Bean
的id
, property
是试图覆盖的属性名(对应于调用setter
方法)。
程序示例
1 | E:\workspace_QingLiangJiJavaEEQiYeYingYongShiZhang5\PropertyOverrideConfigurer |
beans.xml
看如下配置文件。
1 |
|
上面的配置文件中配置数据源Bean
时,没有指定任何属性值,很明显配置数据源Bean
时不指定有效信息是无法连接到数据库服务的。
但因为Spring
容器中部署了一个PropertyOverrideConfigurer
容器后处理器,而且Spring
容器使用ApplicationContext
作为容器,它会自动检测容器中的容器后处理器,并使用该容器后处理器来处理Spring
容器。PropertyOverride Configurer
后处理器读取dbconn.properties
文件中的属性,用于覆盖目标Bean
的属性。因此,如果属性文件中有dataSourceBean
属性的设置,则可在配置文件中为该Bean
指定属性值,这些属性值将会覆盖dataSourceBean
的各属性值。dbconn.properties
属性文件如下:
1 | dataSource.driverClass=com.mysql.jdbc.Driver |
属性文件里每条属性的格式必须是:beanId.property=value
也就是说, dataSource
必须是容器中真实存在的Bean
的id
,否则程序将出错。
程序无法知道BeanFactory
定义是否被覆盖。仅仅通过查看XML
配置文件,无法知道配置文件的配置信息是否被覆盖。如有多个PorpertyOverrideConfigurer
对同一Bean
属性进行了覆盖,最后一次覆盖将会获胜。
对于采用基于XML Schema
的配置文件而言,如果导入了contextSchema
,则可采用如下方式来配置这种重写占位符。
使用context:property-override元素简化配置
1 | <context: property-override location=classpath:db.properties"/> |
也就是说,<context:property-override>
元素是PorpertyOverrideConfigurer
的简化配置。
原文链接: 8.1.5 重写占位符配置器