Установить значение свойства весной из статического поля

У меня есть ситуация, когда мне нужно значение свойства (application.name) до загрузки контекста приложения - весенняя загрузка, до вызова SpringApplication.run и во время загрузки контекста.

В моем классе ApplicationMain, который вызывает SpringApplication.run, у меня есть постоянная public static final NAME = "MyApplicationName".

Моя проблема в том, что у нас есть некоторые библиотеки, которые вводят значение через @Value("${application.name}").

Есть ли способ установить свойство application.name в контексте из этого постоянного значения?

Я думал, что могу сделать постконструкцию, а затем установить ее в среде - аналогично описанному решению здесь, но это не гарантирует, что оно будет доступно для всех инъекций @Value.

Я надеялся, что есть механизм, аналогичный @Bean, в методе, который может устанавливать значение для свойства, но я нигде его не вижу.

1
0
616
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Переменные можно вводить в Spring Boot несколькими способами, но для меня одним из лучших способов является использование переменных операционной системы в * nix или Windows, вы можете определять такие переменные:

Windows
    SET APPLICATION_NAME = "MY APP"

*nix
    export APPLICATION_NAME = "MY APP"

Обратите внимание, что символ подчеркивания (_) заменяется на. внутри вашего приложения. Другой способ - использовать свойства Java, определенные с помощью -Dapplication.name = "MY APP", который вводится в командной строке вашего приложения. После того, как вы определили эти переменные в операционной системе, вы можете поймать их в своем коде, используя:

    @Value("${application.name}")

Итак, я снова рекомендую вам использовать переменные среды для хранения конфигурации вашего приложения, чтобы операторы или сотрудники DevOps могли изменять поведение вашего приложения без сенсорного кода или файлов внутренних свойств (внутри вашего пакета приложения).

Другой способ - установить свойства системы (System.setProperty), которые заставят приложения Java получать переменные, установленные во время выполнения. Фактически это та же карта (карта системы), используемая с использованием -D в командной строке, однако это делается во время выполнения, а не в командной строке. Пример:

      System.setProperty("application.name","MY APP");

Да, мы используем переменные ENV для всего, что можно изменить. Это не из тех случаев. Имя приложения является специфическим и уникальным для приложения и не должно изменяться операциями или DevOps. Чтобы помочь однозначно идентифицировать экземпляры приложения, мы будем использовать переменную ENV, например INSTANCE_NO.

Townsfolk 25.05.2018 00:30

Думаю, теперь я понимаю, каковы ваши требования, это своего рода динамически изменяемые переменные для весенней загрузки, очень конкретное требование ... Мне было интересно, могли бы вы сделать это, создав переменные среды в операционной системе внутри вашего кода ... Но это просто выстрел.

rod.poli.diniz 25.05.2018 00:41

Я не думаю, что переменные ENV могут быть установлены изнутри Java (по крайней мере, не так просто: stackoverflow.com/questions/318239/…), но вы можете установить свойства системы (System.setProperty), и они используются во время загрузки контекста. Если вы обновите свой ответ, я отмечу это. Спасибо!

Townsfolk 25.05.2018 00:57

Другие вопросы по теме