Можно ли рассматривать пары ключ-значение в application.properties как переменные среды? - PullRequest
3 голосов
/ 10 июня 2019

новинка для весенней загрузки.

Изучая переменные env для весенней загрузки, мы узнали, что Переменные env доступны из ${KeyName} из кода.

Есть вопрос как,

Дело 1: В файлах @Configuration мы обращаемся к ключам в application.properties, используя @Value(value = "${KeyName}"). Итак, мы используем почти одинаковый синтаксис для доступа к переменным env и доступа к ключам в application.properties.

Дело 2: При попытке доступа к ключам в application.properties с помощью system.getEnv («имя ключа») я получаю только ноль.

Дело 3: Недавно работал над 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. У меня вопрос, как работает случай 3, когда случай 2 не работает.
  2. Spring boot сделан таким образом, что он разрешает доступ по ${KeyName}, а не system.getEnv(KeyName)? (т.е. Дело 2)

Может кто-нибудь уточнить мои вопросы здесь.

Ответы [ 2 ]

3 голосов
/ 10 июня 2019

См. Документы Spring:

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

Spring включает переменные среды в качестве источника потенциального свойства, но не экспортирует его свойства, определенные другими способами как переменные среды. Так что это не улица с двусторонним движением, поэтому дело № 2 не работает.

Случай № 3 - это отдельная реальность, просто тот факт, что когда K8s запускает контейнер, определенный таким образом с помощью env vars, он делает эти переменные доступными в среде контейнера. Любая система программного обеспечения или язык программирования, способный читать переменные среды, сможет ссылаться на эти переменные, включая код Java. Это не имеет ничего общего с Java или Spring ... это просто еще один способ внедрения переменных среды в среду выполнения.

ОБНОВЛЕНИЕ: Я не видел ответа @ ShaileshPratapwar, пока не опубликовал свой собственный. Кажется, наши ответы примерно одинаковы, хотя я думаю, что хорошо, что вы знаете, откуда берется список источников собственности и их порядок приоритетов. Это очень четко определено в документах Spring.

3 голосов
/ 10 июня 2019

Используя аннотацию @Value, вы можете получить доступ к свойству из многих источников , таких как application.properties или переменная окружения и несколько других источников свойств.

Важным моментом здесь является упорядочение этих источников свойств .

Ниже приведен порядок поиска свойства в различных источниках.

  1. Обозначает свойства глобальных настроек в вашем домашнем каталоге (~/.spring-boot-devtools.properties, когда devtools активен).
  2. @ TestPropertySource аннотации к вашим тестам.
  3. @ SpringBootTest # свойства атрибута аннотации к вашим тестам.
  4. Аргументы командной строки.
  5. Свойства из SPRING_APPLICATION_JSON (встроенный JSON, встроенный в переменную среды или системное свойство)
  6. Параметры инициализации ServletConfig.
  7. Параметры инициализации ServletContext.
  8. Атрибуты JNDI из java: comp / env.
  9. Свойства системы Java (System.getProperties ()).
  10. OПеременные среды S.
  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. @ PropertySource аннотации для ваших классов @Configuration.
  17. По умолчаниюсвойства (задаются с помощью SpringApplication.setDefaultProperties).

В вашем случае свойство объявляется либо в переменной среды, либо в application.yaml и, следовательно, доступно с помощью аннотации @Value.

...