Spring の環境とプロファイル

最終更新: 2026-04-08 03:18:35 +0800 +0800
原文は英語で書かれています。あなたはAI翻訳版を読んでいます。

Spring の Environment は、設定プロパティの解決と、どの Bean 定義プロファイルがアクティブかの判定という 2 つの関心事を統合します。コアフレームワークは抽象化と標準的な JVM/サーブレットのソースを定義し、Spring Boot は独自の外部設定ソースと優先順位規則を追加します。

プロパティソースと優先順位 #

設定可能な環境は、MutablePropertySources 内に順序付けられた PropertySource<?> オブジェクトを保持します。解決では、優先順位の高いソースから低いソースへ検索し、要求されたキーを含む最初のソースの値を返します。ソースに明示的な名前と順序を付けることで、登録順序によって設定が変わることを避けられます。

java
ConfigurableEnvironment environment = context.getEnvironment();
environment.getPropertySources().addFirst(
    new MapPropertySource("deployment", Map.of("orders.timeout", "2s")));

StandardEnvironment には、JVM システムプロパティとオペレーティングシステムの環境変数が含まれます。StandardServletEnvironment は、サーブレット設定、サーブレットコンテキストパラメーター、さらに任意で JNDI ソースを追加します。設定クラスの処理中には、@PropertySource によってプロパティリソースを追加できます。

ソースの順序はポリシーであり、すべてのファイル、JVM プロパティ、環境変数が必ず優先されるという本質的な規則ではありません。Spring Boot は、設定データとコマンドライン引数を含む、より大きく文書化された順序を定義します。テストでは、開発者マシンの環境に依存するのではなく、明示的なテストソースを追加する必要があります。

解決、デフォルト、型 #

PropertyResolver API は、直接参照と型付き参照をサポートします。

java
Duration timeout =
    environment.getProperty("orders.timeout", Duration.class, Duration.ofSeconds(1));

型付きアクセスは、設定された変換サービスに委譲されます。プレースホルダー構文は ${orders.timeout} と、${orders.timeout:1s} のようなフォールバックをサポートします。コンテキストに適切な埋め込み値リゾルバーがある場合、@Value はプレースホルダー解決を使用します。明示的な非 Boot 設定では、PropertySourcesPlaceholderConfigurer がその機能を提供します。

フォールバックが適切なのは、デフォルト値が運用上有効な場合に限られます。Bean が消費する前に、必須設定を宣言して検証できます。

java
environment.setRequiredProperties("database.url", "database.user");
environment.validateRequiredProperties();

未解決の必須プレースホルダーは、運用上安全でない値を暗黙的に選択するのではなく、起動を失敗させる必要があります。シークレットは管理されたプロパティソースを通じて入力し、解決を診断する際にも出力してはなりません。

プロファイル式 #

@Profile は、コンポーネントまたは設定クラスをアクティブなプロファイルに応じて条件付きにします。プロファイル式は、名前、! による否定、& による論理積、| による論理和、括弧をサポートします。

java
@Configuration
@Profile("production & !maintenance")
class ProductionConfiguration {
}

@Profile({"blue", "green"}) のような配列では、いずれかの要素が一致するとコンポーネントがアクティブになります。プロファイル指定のない定義は、アクティブな集合にかかわらず候補となります。

明示的にアクティブなプロファイルがない場合、Spring はデフォルトプロファイルセットを使用します。初期値には default が含まれます。spring.profiles.default によってこのセットを変更できます。したがって、@Profile("default") が付いた Bean は条件付きであり、別のプロファイルがアクティブな場合に無条件のフォールバックとなるわけではありません。

プロファイルのアクティブ化 #

更新前に、プログラムからプロファイルを選択できます。

java
var context = new AnnotationConfigApplicationContext();
context.getEnvironment().setActiveProfiles("integration");
context.register(TestConfiguration.class);
context.refresh();

spring.profiles.active プロパティから指定することもできます。JVM の -Dspring.profiles.active=production は、コアの標準環境で機能します。Spring Boot はさらに、Boot の外部設定規則に従い、コマンドライン設定と SPRING_PROFILES_ACTIVE のような緩和された環境変数名を受け付けます。プログラムからの呼び出しは、setActiveProfiles と addActiveProfile のどちらを使用するかに応じて、環境のアクティブな集合を置き換えるか、そこに追加します。

決定論的な設定 #

本番環境とテストで同じ明示的なポリシーを適用します。

  1. ソース名と優先順位を文書化する。
  2. コンテキストを更新する前にプロファイルをアクティブ化する。
  3. テストが所有する値には @TestPropertySource または @DynamicPropertySource を使用する。
  4. 集中的な設定テストで、重要な解決済み値をアサートする。
  5. プロファイルは粗い粒度に保ち、構成の組み合わせごとにプロファイルを作成するのではなく、値にはプロパティを使用する。

主なリファレンス #

コメント

GitHub で閲覧・コメントする(投稿にはログインが必要です)