PropertySourcesPlaceholderConfigurer
适用于我的@Value
,但不适用于以下公布的数据源配置
@Bean
@ConfigurationProperties(prefix = "datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
我自定义了PropertySourcesPlaceholderConfigurer
来解码配置文件中的密码,但是在这个确切的位置并没有触发解码功能,尽管它在其他地方也可以使用。你能请教吗?
答案 0 :(得分:1)
默认情况下,Spring将使用简单/未包装的ConfigurationPropertySource
而不是更复杂的PropertySourcesPlaceholderConfigurer
,后者包含多个PropertySource
。
在DataSourceBuilder
本身中可以找到一个示例
private void bind(DataSource result) {
ConfigurationPropertySource source = new MapConfigurationPropertySource(this.properties);
ConfigurationPropertyNameAliases aliases = new ConfigurationPropertyNameAliases();
aliases.addAliases("url", "jdbc-url");
aliases.addAliases("username", "user");
Binder binder = new Binder(source.withAliases(aliases));
binder.bind(ConfigurationPropertyName.EMPTY, Bindable.ofInstance(result));
}
对于该代码段,通常使用this.properties
Bean (这是一个DataSourceProperties
带注释的类)来填充@ConfigurationProperties
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean {
问题是,@ConfigurationProperties
将1:1映射到属性文件,这是非常有根据的。
@Value
是另一种野兽。
我在this答案中解决了一个完全自定义的实现。
您可能会发现它很有价值。