使用环境变量覆盖application.properties中的变量的Spring奇怪行为

时间:2018-04-21 08:11:16

标签: java spring spring-boot environment-variables

我正在使用Spring Boot 2并阅读有关externalilzing properties here的文档,我希望我可以通过声明一个同名的os环境变量来覆盖application.properties中变量的值。 / p>

所以我尝试了如下。

首先,在src/main/resources/application.properties

中声明以下2个变量
my.prop = hello   
myProp = hello    

接下来,使用以下内容创建src/main/java/me/Main.java

@SpringBootApplication
public class Main {

    private static final Logger logger = LoggerFactory.getLogger(Main.class);

    @Value("${my.prop}")
    String myDotProp;

    @Value("${myProp}")
    String myProp;

    @Value("${my.env.prop}")
    String envDotProp;

    @PostConstruct
    public void test() {
        logger.debug("my.prop : " + myDotProp);
        logger.debug("myProp : " + myProp);
        logger.debug("my.env.prop : " + envDotProp);
    }

    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
}

现在,使用Windows环境变量面板声明3个变量,如下图所示。

enter image description here

最后,运行mvn spring-boot:run,这就是结果

2018-04-21 14:41:28.677 DEBUG 22520 --- [main] me.Main : my.prop : hello
2018-04-21 14:41:28.677 DEBUG 22520 --- [main] me.Main : myProp : world
2018-04-21 14:41:28.677 DEBUG 22520 --- [main] me.Main : my.env.prop : world

请注意

  1. Spring可以看到环境变量,无论变量名中是否有点(。),如myPropmy.env.prop

  2. 中所示
  3. 只有当名称不包含点(。)时,Spring才能使用同名的os环境变量的值覆盖application.properties中变量的值如myPropmy.prop所示:myProp的值已成功覆盖world,但my.prop的值仍为hello已声明os env变量my.prop

  4. 是否有这种行为的原因,是否有办法配置Spring,以便我可以在我的属性变量中使用点,并使用os env变量覆盖它们?

1 个答案:

答案 0 :(得分:1)

将环境变量中的 . 替换为 _
例如,如果在 Spring Boot 中将属性命名为 my.env.prop 以使用名为 my_env_prop 的环境变量覆盖它,并且 Spring 会自动进行转换。

. 出现问题的原因是某些操作系统不支持环境变量名称中的 .

此处讨论的类似问题:How to set a Spring Boot property with an underscore in its name via Environment Variables?