8.1.5 重写占位符配置器
PropertyOverrideConfigurer是Spring提供的另一个容器后处理器,这个后处理器的作用比上面那个容器后处理器的功能更加强大。PropertyOverrideConfigurer的属性文件指定的信息可以直接覆盖Spring配置文件中的元数据。
如果PropertyOverrideConfigurer的属性文件指定了一些配置的元数据,则这些配置的元数据将会覆盖原配置文件里相应的数据。在这种情况下,可以认为Spring配置信息是XML配置文件和属性文件的总和,当XML配置文件和属性文件指定的元数据不一致时,以属性文件的信息为准。
使用PropertyOverrideConfigurer的属性文件,每条属性应保持如下的格式:beanId.property=valuebeanId是属性占位符试图覆盖的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 重写占位符配置器