我有一个Spring 3.1 @Configuration,它需要一个属性foo来构建bean。该属性在中定义,defaults.properties但是overrides.properties如果应用程序具有活动的override Spring概要文件,则该属性可以覆盖该属性。
@Configuration
foo
overrides.properties
override
没有覆盖,代码将看起来像这样,并且可以工作…
@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()调用将转到何处。
@PropertySource
classpath:overrides.properties
@Profile("overrides")
ConfigurableEnvironment
environment.getPropertySources.addFirst()
如果我直接使用注入属性@Value,则将以下内容放置在XML配置中有效,但使用Environment和getRequiredProperty()方法时则无效。
@Value
Environment
getRequiredProperty()
<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支持。
将覆盖添加到@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"); ... } }