【发布时间】:2018-10-01 21:13:05
【问题描述】:
我正在使用 Spring Boot 2,通过阅读有关外部化属性 here 的文档,我希望我可以通过声明同名的 os 环境变量来覆盖 application.properties 中变量的值。
所以我尝试如下。
首先,在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 个变量,如下图所示。
最后,运行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
请注意
无论变量名中是否有点(.),Spring都能看到环境变量,如
myProp和my.env.prop所示-
Spring 可以使用同名的 os 环境变量的值覆盖
application.properties中变量的值仅当名称不包含点 (.) 时,如图所示在myProp和my.prop中:myProp的值已成功覆盖为world,但my.prop的值保持hello即使我声明了操作系统环境变量my.prop。
这种行为是否有原因?有没有办法配置 Spring,以便我可以在我的属性变量中使用 dot 以及使用 os env 变量覆盖它们?
【问题讨论】:
-
在使用系统环境变量时,建议使用大写符号,所以要设置
MY_ENV_PROP、MY_PROP和MYPROP。
标签: java spring spring-boot environment-variables