Spring Boot application.properties lifecyle

时间:2018-03-27 13:48:04

标签: java spring spring-boot application.properties

我有一个大型的Spring网络应用程序,可以追溯到几年前。我需要将其更新为Spring Boot(公司要求)。我的方式很好 - 它开始(!),虽然注入属性有一些问题,导致应用程序失败。

具体来说,每个配置文件有三个巨大的配置文件,例如qa_config.propertiesqa_ehcache.xmlqa_monitoring.properties。目前我只关心qa_config.properties,我已将其重命名为Spring Boot的首选名称application-qa.propertiesapplication-qa_monitoring.properties

应用程序有许多用@Named注释的类(来自javax.ws.rs-api),这些类是早期加载的 - 所以我需要在构造函数中注入属性:

package com.domain.app;

import org.springframework.beans.factory.annotation.Value;

import javax.inject.Named;

@Named
public class Foo {

    // Cant use @Value here, it is not yet in the context
    protected String bar; // lives in application-qa.properties
    protected String qux; // lives in application-qa_monitoring.properties

    public Foo(@Value("${application.property.named.bar}") String bar,
        @Value("${monitoring.property.named.qux}") String qux) {

        this.bar = bar;
        this.qux = qux;

        doSomeWork();

    }
}

属性文件:

#application-qa.properties
application.property.named.bar=something

#application-qa_monitoring.properties
monitoring.property.named.qux=another_thing

我的问题:我希望尽快在上下文中同时使用application-qa.propertiesapplication-qa_monitoring.properties,并在 @Named类之前加载

为实现这一目标,我正在运行具有qa的活动配置文件的应用程序,该配置文件成功地将该组属性添加到上下文中。

我将此行添加到application.properties文件中,以确保加载其他属性:

spring.profiles.include=${spring.profiles.active}_monitoring.properties

当我运行Spring Boot应用程序时,输出告诉我

The following profiles are active: qa_monitoring.properties,qa

调试Foo类时,bar的值是正确的

但是,qux的值为空。

我是否遗漏了有关加载属性文件的顺序的内容?我原本认为include中的application.properties行足以“平展”#34;这两个文件很早就开始了,如果一个是在上下文中,那么两者都应该可用吗?

我可以做的只是将两个属性文件中的所有变量扔到一个application-qa.properties中,但如果可能的话,我希望保持它们分离并尽可能接近原始结构尽可能。

2 个答案:

答案 0 :(得分:2)

感谢pvpkiran和Andy Brown。

我的application.properties文件应该已经读过

spring.profiles.include=${spring.profiles.active}_monitoring

即,只需添加另一个profile,在这种情况下qa_monitoring - Spring会自动添加application-前缀和.properties suffix

答案 1 :(得分:0)

您遇到的问题是因为您在qux值的@Value注释中使用了文字值而不是查找键。

替换

    public Foo(@Value("${application.property.named.bar}") String bar,
    @Value("monitoring.property.named.qux") String qux) {

    public Foo(@Value("${application.property.named.bar}") String bar,
    @Value("${monitoring.property.named.qux}") String qux) {

它应该有用。