1. Обзор
Начиная с Spring Boot 1.3, мы можем использовать постпроцессор Среды для | настройки Среды приложения до обновления контекста приложения .
В этом уроке давайте рассмотрим, как загрузить и преобразовать пользовательские свойства в среду , а затем получить доступ к этим свойствам .
2. Весенняя среда
Абстракция Environment в Spring представляет среду, в которой выполняется текущее приложение. В то же время он стремится унифицировать способы доступа к свойствам в различных источниках свойств, таких как файлы свойств, системные свойства JVM, переменные среды системы и параметры контекста сервлета.
Таким образом, в большинстве случаев настройка Среды означает манипулирование различными свойствами до того, как они будут подвергнуты воздействию наших компонентов. Для начала, пожалуйста, посетите нашу предыдущую статью о манипулировании свойствами с помощью Spring .
3. Краткий Пример
Теперь давайте создадим простое приложение для расчета цен. Он рассчитает цену либо в режиме брутто, либо в режиме нетто. Переменные системной среды от третьей стороны будут определять, какой режим расчета выбрать.
3.1. Реализация среды постпроцессора
Для этого давайте реализуем интерфейс Environment PostProcessor|/.
Мы будем использовать его для чтения нескольких переменных среды:
calculation_mode=GROSS gross_calculation_tax_rate=0.15
И мы будем использовать постпроцессор, чтобы предоставить их для конкретного приложения, в данном случае с пользовательским префиксом:
com.baeldung.environmentpostprocessor.calculation.mode=GROSS com.baeldung.environmentpostprocessor.gross.calculation.tax.rate=0.15
Затем мы можем довольно просто добавить наши новые свойства в Среду :
@Order(Ordered.LOWEST_PRECEDENCE) public class PriceCalculationEnvironmentPostProcessor implements EnvironmentPostProcessor { @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { PropertySource> system = environment.getPropertySources() .get(SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME); if (!hasOurPriceProperties(system)) { // error handling code omitted } Mapprefixed = names.stream() .collect(Collectors.toMap(this::rename, system::getProperty)); environment.getPropertySources() .addAfter(SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, new MapPropertySource("prefixer", prefixed)); } }
Давайте посмотрим, что мы здесь сделали. Во-первых, мы попросили environment предоставить нам Источник свойств для переменных среды. Вызов результирующего system.getProperty аналогичен вызову Java System.getenv().get.
Затем, пока эти свойства существуют в среде, мы создадим новую карту с префиксом . Для краткости мы пропустим содержимое переименовать , но проверьте пример кода для полной реализации. Результирующая карта имеет те же значения , что и system , но с префиксными ключами.
Наконец, мы добавим наш новый источник свойств в среду . Теперь, если боб запрашивает com.baeldung.environment postprocessor.calculation.mode , Environment будет сверяться с нашей картой.
Обратите внимание, кстати, что Окружающий постпроцессор Javadoc побуждает нас либо реализовать Упорядоченный интерфейс, либо использовать аннотацию @Order .
И это, конечно, только один источник свойств . Spring Boot позволяет нам обслуживать множество источников и форматов.
3.2. Регистрация весной.
Чтобы вызвать реализацию в процессе начальной загрузки Spring Boot, нам нужно зарегистрировать класс в META-INF/spring.factories :
org.springframework.boot.env.EnvironmentPostProcessor= com.baeldung.environmentpostprocessor.PriceCalculationEnvironmentPostProcessor
3.3. Доступ к Свойствам С помощью Аннотации @Value
Давайте используем их в нескольких классах. В примере у нас есть Калькулятор цен интерфейс с двумя реализациями: Калькулятор валовой цены и NetPriceCalculator.
В наших реализациях мы можем просто использовать @Value для получения наших новых свойств:
public class GrossPriceCalculator implements PriceCalculator { @Value("${com.baeldung.environmentpostprocessor.gross.calculation.tax.rate}") double taxRate; @Override public double calculate(double singlePrice, int quantity) { //calcuation implementation omitted } }
Это хорошо, так как это тот же способ, которым мы получаем доступ к любым другим свойствам, таким как те, которые мы определили в application.properties.
3.4. Доступ к свойствам в автоматической конфигурации Spring Boot
Теперь давайте рассмотрим сложный случай, когда мы обращаемся к предыдущим свойствам в автоконфигурации Spring Boot.
Мы создадим класс автоматической конфигурации для чтения этих свойств. Этот класс инициализирует и подключает компоненты в контексте приложения в соответствии с различными значениями свойств:
@Configuration @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE) public class PriceCalculationAutoConfig { @Bean @ConditionalOnProperty(name = "com.baeldung.environmentpostprocessor.calculation.mode", havingValue = "NET") @ConditionalOnMissingBean public PriceCalculator getNetPriceCalculator() { return new NetPriceCalculator(); } @Bean @ConditionalOnProperty(name = "com.baeldung.environmentpostprocessor.calculation.mode", havingValue = "GROSS") @ConditionalOnMissingBean public PriceCalculator getGrossPriceCalculator() { return new GrossPriceCalculator(); } }
Как и в реализации Environment PostProcessor , класс автоматической конфигурации также должен быть зарегистрирован в META-INF/spring.factories :
org.springframework.boot.autoconfigure.EnableAutoConfiguration= com.baeldung.environmentpostprocessor.autoconfig.PriceCalculationAutoConfig
Это работает, потому что пользовательский постпроцессор среды реализации запускаются до автоконфигурации Spring Boot . Эта комбинация делает автоконфигурацию Spring Boot более мощной.
И для получения более подробной информации об автоконфигурации Spring Boot, пожалуйста, ознакомьтесь со статьей о пользовательской автоконфигурации с помощью Spring Boot .
4. Протестируйте пользовательскую реализацию
Теперь пришло время протестировать наш код. Мы можем установить системные переменные среды в Windows, запустив:
set calculation_mode=GROSS set gross_calculation_tax_rate=0.15
Или в Linux/Unix мы можем экспортировать их вместо этого:
export calculation_mode=GROSS export gross_calculation_tax_rate=0.15
После этого мы могли бы начать тест с помощью команды mvn spring-boot:run :
mvn spring-boot:run -Dstart-class=com.baeldung.environmentpostprocessor.PriceCalculationApplication -Dspring-boot.run.arguments="100,4"
5. Заключение
Таким образом, реализация Environment PostProcessor способна загружать произвольные файлы в различных форматах из разных мест. Кроме того, мы можем выполнить любое преобразование, необходимое для того, чтобы свойства были легко доступны в среде | для последующего использования. Эта свобода, безусловно, полезна, когда мы интегрируем приложение на основе Spring Boot со сторонними конфигурациями.
Исходный код можно найти в репозитории GitHub .