<context:property-placeholder location="classpath:com/something/jdbc.properties"/>
原文链接: Container Extension Points
BeanFactoryPostProcessor接口的语义跟BeanPostProcessor相似,但有一个重要区别:它作用于Bean的配置元数据。即Spring IOC容器让BeanFactoryPostProcessor读取配置元数据并在容器实例化Bean之前进行修改。(不会作用于它自身)。
你可以配置多个BeanFactoryPostProcessor,并且通过设置order属性,控制这些实例的运行顺序。要设置order属性,需要先实现Ordered接口。如果你写了自定义的BeanFactoryProcessor, 你也应该考虑实现Ordered接口。具体看这俩接口的java doc: BeanFactoryPostProcessor
\ Ordered
。
BeanPostProcessor
)。 尽管从实际技术来说,在BeanFactoryPostProcessor里可以操作Bean实例,但这会导致Bean过早实例化,违背了标准容器的生命周期。可能造成负面影响,例如绕过bean后处理。
在ApplicationContext声明后,BeanFactoryPostPorcessor会自动运行,来更改容器中定义的配置元数据。Spring包含很多预定义的BeanFactoryPostProcessor,像PropertyOverrideConfigurer和PropertySourcesPlaceholderConfigurer。也可以自定义BeanFactoryPostProcessor,比如自定义属性编辑器。
ApplicationContext会自动检测BeanFactoryPostProcessor的实现类,在适当的时候用作后处理器。它的部署跟其他Bean一样。
典型应用场景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