gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:04:29 25 4
gpt4 key购买 nike

我有一个 Spring 3.1 @Configuration 需要一个属性 foo 来构建一个 bean。该属性在 defaults.properties 中定义,但如果应用程序具有事件的 override Spring 配置文件,则可能会被 overrides.properties 中的属性覆盖。

如果没有覆盖,代码将如下所示,并且可以工作...

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

@Autowired
private Environment environment;

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

我想要 classpath:overrides.properties@PropertySource 取决于 @Profile("overrides")。有没有人对如何实现这一点有任何想法?我考虑过的一些选项是重复的 @Configuration,但这会违反 DRY 或 ConfigurableEnvironment 的编程操作,但我不确定 的位置environment.getPropertySources.addFirst() 调用会去。

如果我直接使用 @Value 注入(inject)属性,则将以下内容放在 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 support ,尤其是“使用 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");
...
}
}

关于spring - Spring配置文件可以选择@PropertySources吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12691812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com