Spring的PropertySourcesPlaceholderConfigurer用于从XML或Java Config中定义的Spring bean定义外部化属性。 PlaceholderConfigurer支持的一些选项在文档中并不明显,但是很有趣并且可能有用。
首先,以Spring文档中的示例为例,考虑一个属性文件,其中包含用于配置数据源的信息:
jdbc.driverClassName=org.hsqldb.jdbcDriver
jdbc.url=jdbc:hsqldb:hsql://production:9002
jdbc.username=sa
jdbc.password=root
使用自定义名称空间配置PropertySourcesPlaceholderConfigurer:
<context:property-placeholder location='database.properties'/>
可以通过以下方式使用基于XML的bean定义来定义利用这些属性的数据源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>
并以这种方式使用基于Java的配置:
@Value('${jdbc.driverClassName}') private String driverClassName;
@Value('${jdbc.url}') private String dbUrl;
@Value('${jdbc.username}') private String dbUserName;
@Value('${jdbc.password}') private String dbPassword;@Bean
public BasicDataSource dataSource() {BasicDataSource dataSource = new BasicDataSource();dataSource.setDriverClassName(driverClassName);dataSource.setUrl(dbUrl);dataSource.setUsername(dbUserName);dataSource.setPassword(dbPassword);return dataSource;
}
不太明显的选项是:
首先是对默认值的支持。 例如,如果要为jdbc用户名默认提供“ sa”,则使用这种方法(使用$ {propertyName:default}语法):
<property name='username' value='${jdbc.username:sa}'/>
或使用Java Config:
..
..
@Value('${jdbc.username:sa}') private String dbUserName;@Bean
public BasicDataSource dataSource() {
..
}
其次是对嵌套属性解析的支持,例如考虑以下属性:
phase.properties文件–
phase=qa
jdbc.username.qa=qasa
jdbc.username.dev=devsa
并以这种嵌套方式将'phase'属性用作XML bean定义中另一个属性的一部分:
<property name='username' value='${jdbc.username.${phase}}'/>
这些选项对于基于占位符的配置可能非常有用。
参考: Spring Property占位符配置器– all和杂物博客中,我们的JCG合作伙伴 Biju Kunjummen提供了一些不太明显的选择 。
翻译自: https://www.javacodegeeks.com/2013/01/spring-property-placeholder-configurer-a-few-not-so-obvious-options.html