一尘不染

Spring配置文件可以选择@PropertySources吗?

spring

我有一个Spring 3.1 @Configuration,它需要一个属性foo来构建bean。该属性在中定义,defaults.properties但是overrides.properties如果应用程序具有活动的override Spring概要文件,则该属性可以覆盖该属性。

没有覆盖,代码将看起来像这样,并且可以工作…

@Configuration
@PropertySource("classpath:defaults.properties")
public class MyConfiguration {

    @Autowired
    private Environment environment;

    @Bean
    public Bean bean() {
        ...
        // this.environment.getRequiredProperty("foo");
        ...
    }
}

我想一个@PropertySource用于classpath:overrides.properties对队伍@Profile("overrides")。是否有人对如何实现这一目标有任何想法?我考虑过的某些选项是重复的@Configuration,但会违反DRY或对的编程操作ConfigurableEnvironment,但我不确定environment.getPropertySources.addFirst()调用将转到何处。

如果我直接使用注入属性@Value,则将以下内容放置在XML配置中有效,但使用EnvironmentgetRequiredProperty()方法时则无效。

<context:property-placeholder ignore-unresolvable="true" location="classpath:defaults.properties"/>

<beans profile="overrides">
    <context:property-placeholder ignore-unresolvable="true" order="0"
                                  location="classpath:overrides.properties"/>
</beans>

如果你现在尝试这样做,请查看Spring Boot的YAML支持,特别是“使用YAML代替属性”部分。那里的个人资料支持将使这个问题无济于事,但是还没有@PropertySource支持。


阅读 1004

收藏
2020-04-19

共1个答案

一尘不染

将覆盖添加到@PropertySource静态内部类中。不幸的是,你必须一起指定所有属性源,这意味着创建一个“默认”配置文件来替代“替代”。

@Configuration
public class MyConfiguration
{
    @Configuration
    @Profile("default")
    @PropertySource("classpath:defaults.properties")
    static class Defaults
    { }

    @Configuration
    @Profile("override")
    @PropertySource({"classpath:defaults.properties", "classpath:overrides.properties"})
    static class Overrides
    {
        // nothing needed here if you are only overriding property values
    }

    @Autowired
    private Environment environment;

    @Bean
    public Bean bean() {
        ...
        // this.environment.getRequiredProperty("foo");
        ...
    }
}
2020-04-19