我有一个 Spring 3.1 @Configuration
,它需要一个属性foo
来构建一个 bean。如果应用程序具有活动的Spring 配置文件,则该属性在中定义,defaults.properties
但可能被该属性覆盖。overrides.properties
override
如果没有覆盖,代码将如下所示,并且可以工作......
@Configuration
@PropertySource("classpath:defaults.properties")
public class MyConfiguration {
@Autowired
private Environment environment;
@Bean
public Bean bean() {
...
// this.environment.getRequiredProperty("foo");
...
}
}
我想要一个@PropertySource
forclasspath:overrides.properties
条件@Profile("overrides")
。有没有人对如何实现这一点有任何想法?我考虑过的一些选项是重复的@Configuration
,但这会违反 DRY 或对 的编程操作ConfigurableEnvironment
,但我不确定environment.getPropertySources.addFirst()
调用会去哪里。
如果我直接用 注入属性,则将以下内容放在 XML 配置中有效@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
支持。