Dev Study
← Spring コース

51. 設定の優先順位

は設定値を1か所から読むのではなく、重ねて持った複数のから探します。同じキーが複数あれば、順位の高い設定元の値が返ります。実測では、コマンドライン引数、、環境変数、、 の順に強く、 を5か所に書くと は引数の 8084 で待ち受けました。

この順は、同じアプリを環境ごとに設定だけ変えて動かすためのものです。リファレンスは、同じコードを違う環境で使えるように設定を外へ出せること、値を無理なく上書きできるよう順序を設計したことを述べています。application.properties が既定値、環境変数や引数が差し替えという使い分けになります。負けた値は消えずに設定元ごとに残り、上から探して最初に見つかったものが返ります。

向きに注意が要ります。リファレンスの一覧は後ろほど強く、 の設定元を並べた表示は上ほど強いので、逆です。環境変数の名前は、ドットをアンダースコアに置き換え、ダッシュを取り除き、大文字にするのが文書の規則で、app.max-retry-count なら APP_MAXRETRYCOUNT です。APP_MAX_RETRY_COUNT でも値は入りましたが、4.1.1 で1回観測しただけで、通る条件は確かめていません。

点線の付いた語はタップすると説明が出ます。用語集を開く →

同じキーを5か所に書いたとき(Spring Boot 4.1.1 での実測。上ほど強い)
コマンドライン引数--server.port=8084
これが返る。Tomcat も 8084 で待ち受けた
ここに無ければ次を探す
システムプロパティ-Dserver.port=8085
無ければ次
環境変数SERVER_PORT=8083
無ければ次
application-dev.propertiesserver.port=8082(プロファイル dev が有効なとき)
無ければ次
application.propertiesserver.port=8081
既定値を置く場所
  • ・リファレンスの一覧はこの図と逆向きで、後ろに書かれたものほど強い順に並んでいます
  • ・実測したのはこの5つです。一覧にある JNDI や SPRING_APPLICATION_JSON、JAR の外に置いた設定ファイルなどは走らせていません
  • ・数字の大小に意味はありません。8085 より 8084 が勝ったのは、引数がシステムプロパティより強いからです

サンプルコード(フレームワーク環境が必要なため表示のみ)

// ConfigApp.java — 同じキーを5か所に書いて、どれが返るかを見る(import は省略)
package l18.config;

@ConfigurationProperties("app")
record AppProperties(String greeting, int maxRetryCount) {}

@SpringBootApplication
@EnableConfigurationProperties(AppProperties.class)
public class ConfigApp {
    public static void main(String[] args) {
        ConfigurableApplicationContext ctx = SpringApplication.run(ConfigApp.class, args);
        ConfigurableEnvironment env = ctx.getEnvironment();
        System.out.println("active profiles      = " + java.util.List.of(env.getActiveProfiles()));
        System.out.println("server.port          = " + env.getProperty("server.port"));
        System.out.println("app.greeting         = " + env.getProperty("app.greeting"));
        System.out.println("AppProperties        = " + ctx.getBean(AppProperties.class));
        ctx.close();
    }
}

// 5か所に同時に与えたもの(Spring Boot 4.1.1 / JDK 25)
//   application.properties       server.port=8081  app.greeting=from application.properties
//   application-dev.properties   server.port=8082  app.greeting=from application-dev.properties
//   環境変数                      SERVER_PORT=8083  APP_GREETING=from environment variable
//   システムプロパティ             -Dserver.port=8085 -Dapp.greeting=from system property
//   コマンドライン引数             --server.port=8084 --app.greeting=from command line
//   (プロファイルは環境変数 SPRING_PROFILES_ACTIVE=dev で有効にした)
//
// 出力(起動ログからは2行だけ抜粋。時刻などは省略)
// The following 1 profile is active: "dev"
// Tomcat initialized with port 8084 (http)
// active profiles      = [dev]
// server.port          = 8084
// app.greeting         = from command line
// AppProperties        = AppProperties[greeting=from command line, maxRetryCount=1]

図やコードに出てくる用語(タップで説明)

サンプルコードで身につける(5本) →

学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。

公式ドキュメントで詳しく ↗