1. 概要

Spring Boot 1.3以降、EnvironmentPostProcessorを使用してアプリケーションコンテキストが更新される前にアプリケーションの環境をカスタマイズすることができます

このチュートリアルでは、カスタムプロパティをロードして環境に変換し、それらのプロパティにアクセスする方法を見てみましょう。

2. 春環境

SpringのEnvironment抽象化は、現在のアプリケーションが実行されている環境を表します。  一方、プロパティファイル、JVMシステムプロパティ、システム環境変数、サーブレットコンテキストパラメータなど、さまざまなプロパティソースのプロパティにアクセスする方法を統一する傾向があります。

したがって、ほとんどの場合、環境のカスタマイズとは、Beanに公開される前にさまざまなプロパティを操作することを意味します。まず、Springを使用したプロパティの操作に関する以前の記事にアクセスしてください。

3. 簡単な例

次に、簡単な価格計算アプリケーションを作成しましょう。 グロスベースまたはネットベースのモードで価格を計算します。 サードパーティのシステム環境変数によって、選択する計算モードが決まります。

3.1. EnvironmentPostProcessorの実装

これを行うには、EnvironmentPostProcessorインターフェイスを実装しましょう。

これを使用して、いくつかの環境変数を読み取ります。

calculation_mode=GROSS 
gross_calculation_tax_rate=0.15

そして、ポストプロセッサを使用して、これらをアプリケーション固有の方法で公開します。この場合は、カスタムプレフィックスを使用します。

com.baeldung.environmentpostprocessor.calculation.mode=GROSS
com.baeldung.environmentpostprocessor.gross.calculation.tax.rate=0.15

次に、新しいプロパティをEnvironmentに簡単に追加できます。

@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<String, Object> prefixed = names.stream()
          .collect(Collectors.toMap(this::rename, system::getProperty));
        environment.getPropertySources()
          .addAfter(SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, new MapPropertySource("prefixer", prefixed));
    }

}

ここで何をしたか見てみましょう。 初め、 環境変数のPropertySourceを提供するようにenvironmentに依頼しました。 結果を呼び出す system.getProperty Javaの呼び出しに似ています System.getenv()。get。

次に、これらのプロパティが環境に存在する限り、新しいマップを作成します。 プレフィックス付き。簡潔にするために、名前の変更の内容はスキップします。 ]ですが、完全な実装についてはコードサンプルを確認してください。 結果のマップの値はsystemと同じですが、キーのプレフィックスが付いています。

最後に、新しい PropertySource 環境に追加します。ここで、Beanが com.baeldung.environmentpostprocessor.calculation.mode を要求した場合、 X173X]環境は私たちの地図を参照します。

ちなみに、EnvironmentPostProcessorのJavadocは、 Ordered インターフェイスを実装するか、@Orderアノテーションを使用することを推奨していることに注意してください。

もちろん、これは単一のプロパティソースです。Spring Bootを使用すると、さまざまなソースやフォーマットに対応できます。

3.2. spring.factoriesへの登録

Spring Bootブートストラッププロセスで実装を呼び出すには、 META-INF /spring.factoriesにクラスを登録する必要があります。

org.springframework.boot.env.EnvironmentPostProcessor=
  com.baeldung.environmentpostprocessor.PriceCalculationEnvironmentPostProcessor

3.3. @Valueアノテーションを使用してプロパティにアクセスする

これらをいくつかのクラスで使用してみましょう。 サンプルには、 PriceCalculator インターフェイスがあり、GrossPriceCalculatorNetPriceCalculator。の2つの実装があります。

私たちの実装では、 @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. SpringBoot自動構成のプロパティにアクセスします

ここで、Spring Boot自動構成で前述のプロパティにアクセスする複雑なケースを見てみましょう。

これらのプロパティを読み取るための自動構成クラスを作成します。 このクラスは、さまざまなプロパティ値に従って、アプリケーションコンテキストでBeanを初期化してワイヤリングします。

@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();
    }
}

EnvironmentPostProcessor の実装と同様に、自動構成クラスも META-INF /spring.factoriesに登録する必要があります。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=
  com.baeldung.environmentpostprocessor.autoconfig.PriceCalculationAutoConfig

これが機能するのは、カスタムEnvironmentPostProcessor実装が、SpringBoot自動構成がする前に開始されるためです。 この組み合わせにより、SpringBootの自動構成がより強力になります。

また、Spring Bootの自動構成の詳細については、SpringBootを使用したカスタム自動構成の記事を参照してください。

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. 結論

要約すると、EnvironmentPostProcessor実装は、さまざまな場所からさまざまな形式の任意のファイルをロードできます。さらに、環境でプロパティをすぐに利用できるようにするために必要な変換を実行できます。 後で使用します。 この自由は、SpringBootベースのアプリケーションをサードパーティの構成と統合するときに確かに役立ちます。

ソースコードはGitHubリポジトリにあります。