Рубрики
Без рубрики

Постпроцессор среды в весенней загрузке

Узнайте, как использовать постпроцессор среды для настройки среды приложения до обновления контекста приложения.

Автор оригинала: baeldung.

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
        }
        Map prefixed = 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 .