首页 > 编程语言 > 详细

【译文】Spring IOC Container Extension Points-1.8.2 BeanFactoryPostProcessor

时间:2021-02-26 19:15:44      阅读:46      评论:0      收藏:0      [点我收藏+]

原文链接: Container Extension Points

 1.8.2 通过BeanFactoryPostProcessor自定义配置元数据

BeanFactoryPostProcessor接口的语义跟BeanPostProcessor相似,但有一个重要区别:它作用于Bean的配置元数据。即Spring IOC容器让BeanFactoryPostProcessor读取配置元数据并在容器实例化Bean之前进行修改。(不会作用于它自身)。

 

你可以配置多个BeanFactoryPostProcessor,并且通过设置order属性,控制这些实例的运行顺序。要设置order属性,需要先实现Ordered接口。如果你写了自定义的BeanFactoryProcessor, 你也应该考虑实现Ordered接口。具体看这俩接口的java doc: BeanFactoryPostProcessor \ Ordered

如果你想改变Bean对象(该对象通过配置元数据创建),需要使用BeanPostProcessor(详见文档: Customizing Beans by Using a BeanPostProcessor)。 尽管从实际技术来说,在BeanFactoryPostProcessor里可以操作Bean实例,但这会导致Bean过早实例化,违背了标准容器的生命周期。可能造成负面影响,例如绕过bean后处理。

 

在ApplicationContext声明后,BeanFactoryPostPorcessor会自动运行,来更改容器中定义的配置元数据。Spring包含很多预定义的BeanFactoryPostProcessor,像PropertyOverrideConfigurer和PropertySourcesPlaceholderConfigurer。也可以自定义BeanFactoryPostProcessor,比如自定义属性编辑器。

 

ApplicationContext会自动检测BeanFactoryPostProcessor的实现类,在适当的时候用作后处理器。它的部署跟其他Bean一样。

同BeanPostProcessor一样,一般不会把BeanFactoryProcessor配置为懒加载,因为如果Bean(Factory)PostProcessor没有被引用,那它根本不会被实例化。因此,它的懒加载标记会被直接忽略,即使在声明中,设置default-lazy-init=true

 

典型应用场景1. The Class Name Substitutioon PropertySourcesPlaceHOlderConfigurer

PropertySourcesPlaceholderConfigurer通过使用标准Java属性格式,将类定义中的属性值外部化到独立文件中。这样部署应用到不同环境时,可以自定义环境相关属性,比如:数据库URLS和密码。不用冒风险改部署的文件了。

<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="locations" value="classpath:com/something/jdbc.properties"/>
</bean>

<bean id="dataSource" destroy-method="close"
        class="org.apache.commons.dbcp.BasicDataSource">
    <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>

上面的代码中,属性值配置在外部Properties文件中。运行时PropertySourcesPlaceholderConfigurer会作用于配置元数据,完成属性替换。待替换的占位符格式为${property-name},该格式遵循Ant、Log4j、JSP EL风格。

 

外部Properties文件的定义如下:

jdbc.driverClassName=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:hsql://production:9002
jdbc.username=sa
jdbc.password=root

 

PropertySourcesPlaceHolderConfigurer会检查配置元数据中的占位符。此外,你可以自定义占位符前后缀,比如从${},改为$[]。

Spring2.5引入了context namespace,可以用property-placeholder 专用属性进行配置,多个location以逗号分割。

<context:property-placeholder location="classpath:com/something/jdbc.properties"/>

 

PropertySourcesPlaceholderConfigurer不只从指定的Properties文件中查找。默认情况下,如果在指定的文件中查找不到,会查找Spring Environment属性和Java System属性。

 

【译文】Spring IOC Container Extension Points-1.8.2 BeanFactoryPostProcessor

原文:https://www.cnblogs.com/dameiwujaing/p/14431013.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!