如何让@PropertyResource优先于Spring中的任何其他application.properties?

时间:2017-01-04 11:41:29

标签: java spring spring-boot

我正在尝试在类路径之外添加外部配置属性资源。它应该覆盖任何现有属性。

但以下不起作用:

@SpringBootApplication
@PropertySource("d:/app.properties")
public class MyClass extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(MyClass .class);
    }

    @Value("${my.property}")
    private String myprop;

    @PostConstruct
    public void init() {
        Sysout(myprop);
    }
}

的src /主/资源/ application.properties:

my.property=internal

d:/app.properties:

my.property=external

启动应用时的结果:内部

为什么?

4 个答案:

答案 0 :(得分:2)

你做不到。 @PropertySource处理a well defined precedence order。您可以使用EnvironmentPostProcessor以任意方式自定义环境。

我们在Devoxx演示文稿中解释该用例,请参阅this section of the presentation了解更多详情。您还可以find the code sample online

特别是,如果您使用addFirst,您会发现自定义PropertySource优先于所有内容。但您也可以实现EnvironmentPostProcessor,以便命令行参数或系统属性仍然覆盖这些值。我觉得这很有用但你的用例可能有所不同。

答案 1 :(得分:1)

通过在配置应用程序期间显式定义spring.config.location属性来解决问题(因为编写后我无法在启动时将其添加为jvm环境属性):

@SpringBootApplication
public class MyClass extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(MyClass.class)
             .properties("spring.config.location=file:d/app.properties");
    }
}

答案 2 :(得分:0)

加载外部配置时有一个优先顺序 -

  • / config当前目录的子目录。
  • 当前目录
  • classpath / config package
  • classpath root

因此,您当前的结构是查找属性文件的最高实例

尝试将--spring.config.location添加到外部文件中,或将外部属性文件放在您从

开始弹出的目录中

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

答案 3 :(得分:0)

您可以尝试以下方法:

@PropertySource批注中给出两条路径,例如:

@PropertySource(value = { "classpath:application.properties", "<Path to your external application.properties>" }, ignoreResourceNotFound = true),现在,如果外部文件的任何属性具有相同的key,则外部文件将获胜,从而覆盖资源文件夹中的application.properties