可以将application.properties中的键值对视为环境变量吗?

时间:2019-06-10 04:58:42

标签: spring-boot kubernetes environment-variables application.properties configmap

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)访问这些值。

  1. 我的问题是,情况2不起作用时情况3如何运作。
  2. Spring引导程序是否可以通过${KeyName}而不是system.getEnv(KeyName)进行访问? (即案例2)

有人可以在这里澄清我的问题吗?

2 个答案:

答案 0 :(得分:3)

使用@Value批注,您可以从许多属性源中访问属性,例如在application.properties或环境变量中,以及更多的属性源。

这里的重点是这些属性来源的排序

下面是在各种来源中查找属性的顺序。

  1. 主目录中的Devtools全局设置属性(当devtools处于活动状态时,〜/ .spring-boot-devtools.properties)。
  2. 测试上的
  3. @TestPropertySource批注。
  4. 测试中的
  5. @ SpringBootTest#properties批注属性。
  6. 命令行参数。
  7. SPRING_APPLICATION_JSON中的属性(嵌入在环境变量或系统属性中的嵌入式JSON)
  8. ServletConfig初始化参数。
  9. ServletContext初始化参数。
  10. 来自java:comp / env的JNDI属性。
  11. Java系统属性(System.getProperties())。
  12. 操作系统环境变量。
  13. 仅具有随机属性的RandomValuePropertySource。*。
  14. 打包的jar之外的特定于配置文件的应用程序属性(application- {profile} .properties和YAML变体)
  15. 打包在jar中的特定于配置文件的应用程序属性(application- {profile} .properties和YAML变体)
  16. 打包的jar之外的应用程序属性(application.properties和YAML变体)。
  17. 打包在jar中的应用程序属性(application.properties和YAML变体)。
  18. @Configuration类上的
  19. @PropertySource注释。
  20. 默认属性(使用SpringApplication.setDefaultProperties指定)。

对于您而言,该属性是在环境变量中或在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文档非常清楚地定义了它。