3

弹簧靴的新手。

在探索 Spring Boot 环境变量时,了解到环境变量可以通过${KeyName}代码访问。

有一个问题,例如,

案例 1: 在 @Configuration 文件中,我们使用@Value(value = "${KeyName}"). 因此,我们使用几乎相同的语法来访问环境变量和访问 application.properties 中的键。

案例 2: 当尝试使用 system.getEnv("keyname") 访问 application.properties 中的键时,我只得到了 null。

案例 3: 最近在 Kubernetes 中使用 spring boot 进行 configmap工作。

配置文件看起来像,

spec:
  containers:
  - name: demo-configconsumercontainer
    image: springbootappimage:latest
    ports:
    - containerPort: 8080
    envFrom:
      - configMapRef:
          name: example-configmap

configMap 中的所有值都导出为环境变量,我正在通过@Value(value = "${KeyName}")和 by访问这些值system.getEnv(KeyName)

  1. 我的问题是,当案例 2 不是时,案例 3 是如何工作的。
  2. Spring boot 是否以这种方式允许访问${KeyName}而不是访问system.getEnv(KeyName)?(即案例2)

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

4

2 回答 2

4

使用 @Value 注释,您可以从许多属性源(例如 application.properties 或环境变量)和更多的属性源访问属性。

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

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

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

在您的情况下,该属性要么在环境变量中声明,要么在 application.yaml 中声明,因此可以使用 @Value 注释访问。

于 2019-06-10T05:08:32.057 回答
3

请参阅 Spring 文档:

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

Spring 包含环境变量作为潜在的属性源,但不会将其以其他方式定义的属性导出为环境变量。所以它不是一条双向街道,这就是案例#2 不起作用的原因。

案例 #3 是一个单独的现实,事实上,当 K8s 使用 env var 运行以这种方式定义的容器时,它会使这些 var 在容器环境中可用。任何能够读取环境变量的软件系统或编程语言都将能够引用这些变量,包括 Java 代码。这与 Java 或 Spring 没有任何关系……它只是将环境变量注入运行时环境的另一种方式。

更新:直到我发布了自己的答案,我才看到@ShaileshPratapwar 的答案。似乎我们的答案大致相同,尽管我认为您知道财产来源列表及其优先顺序的来源是件好事。Spring 文档对此进行了非常明确的定义。

于 2019-06-10T05:10:56.273 回答