@ConfigurationProperties不使用PropertySourcesPlaceholderConfigurer

时间:2019-03-25 12:39:44

标签: java spring-boot

PropertySourcesPlaceholderConfigurer适用于我的@Value,但不适用于以下公布的数据源配置

@Bean
@ConfigurationProperties(prefix = "datasource")
public DataSource dataSource() {
    return DataSourceBuilder.create().build();
}

我自定义了PropertySourcesPlaceholderConfigurer来解码配置文件中的密码,但是在这个确切的位置并没有触发解码功能,尽管它在其他地方也可以使用。你能请教吗?

1 个答案:

答案 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答案中解决了一个完全自定义的实现。
您可能会发现它很有价值。