Spring Boot的新手。
在探索spring boot env变量时,我知道,
可以通过 ${KeyName}
从代码中访问环境变量。
收到了类似的问题
情况1:
在@Configuration文件中,我们正在使用 @Value(value = "${KeyName}")
访问application.properties中的键。
因此,我们使用几乎相同的语法来访问env变量和访问application.properties中的键。
案例2: 尝试使用system.getEnv(“ keyname”)访问application.properties中的键时,我只有null。
情况3: 最近在使用Spring Boot的Kubernetes中研究了 configmap 。
配置文件看起来像
spec:
containers:
- name: demo-configconsumercontainer
image: springbootappimage:latest
ports:
- containerPort: 8080
envFrom:
- configMapRef:
name: example-configmap
configMap中的所有值都作为环境变量导出,并且
我正在通过@Value(value = "${KeyName}")
和system.getEnv(KeyName)
访问这些值。
${KeyName}
而不是system.getEnv(KeyName)
进行访问? (即案例2)有人可以在这里澄清我的问题吗?
答案 0 :(得分:3)
使用@Value批注,您可以从许多属性源中访问属性,例如在application.properties或环境变量中,以及更多的属性源。
这里的重点是这些属性来源的排序。
下面是在各种来源中查找属性的顺序。
对于您而言,该属性是在环境变量中或在application.yaml中声明的,因此可以使用@Value批注进行访问。
答案 1 :(得分:3)
请参阅Spring文档:
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
Spring包含环境变量作为潜在的属性源,但不会将其以其他方式定义的属性导出为环境变量。因此,这不是一条双向路,这就是为什么案例2不起作用的原因。
第3种情况是一个单独的现实,即当K8运行以env vars以此方式定义的容器时,它使这些var在容器环境中可用。任何能够读取环境变量的软件系统或编程语言都将能够引用那些变量,包括Java代码。这与Java或Spring无关,只是将环境变量注入运行时环境的另一种方式。
更新:在发布自己的答案之前,我没有看到@ShaileshPratapwar的答案。似乎我们的答案大致相同,尽管我认为最好知道属性来源列表及其优先顺序来自何处。 Spring文档非常清楚地定义了它。