Dev Study
← 解説「設定の優先順位」に戻る

サンプルコードで身につける: 設定の優先順位

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

1素の Java で「上から順に探す」を書く

を強い順に並べたリストを作り、キーを上から探して最初に見つかった値を返すだけのプログラムです。 は使っていません。負けた値は消えずに各設定元に残っていて、先頭の設定元を外すと次の値が返ります。優先順位の正体はこの並び順です。

Java

2application.properties とプロファイル別のファイル

実験で使った2つのファイルです。 は、 dev を有効にしたときだけ読まれ、同じキーがあれば より強くなります。dev のほうに書いていない app.max-retry-count は、application.properties の 1 がそのまま使われます。

クラスパスに置いた2つの設定ファイル設定ファイル
# application.properties
server.port=8081
app.greeting=from application.properties
app.max-retry-count=1
 
# application-dev.properties
server.port=8082
app.greeting=from application-dev.properties

3設定元を1つずつ足していく

A から E へ、設定元を1つずつ足しながら起動した結果です。足すたびに、新しく足したものの値が返っています。D で の 8085 にしたあと E で引数の 8084 が勝っているので、数字の大小ではなく設定元の順位で決まっていることが分かります。 が実際に待ち受けたポートもこの値と一致しました。

与えたものと、返った値(Spring Boot 4.1.1)表
与えたもの | server.port | app.greeting
---+----------------------------------------------+-------------+--------------------------------
A | application.properties(8081) | 8081 | from application.properties
B | A + プロファイル dev(dev のファイルは 8082)| 8082 | from application-dev.properties
C | B + 環境変数 SERVER_PORT=8083 APP_GREETING=...| 8083 | from environment variable
D | C + -Dserver.port=8085 -Dapp.greeting=... | 8085 | from system property
E | D + --server.port=8084 --app.greeting=... | 8084 | from command line

4負けた値も残っている

5か所すべてに値を与えた E で、 が持つ設定元を上から並べた出力です(上ほど強い)。app.greeting は commandLineArgs、systemProperties、systemEnvironment と2つのファイルのすべてに残っていて、いちばん上のものが返っています。なお configurationProperties は他の設定元を束ねて見せる入れ物で、独立した設定元ではありません。

E の出力(起動ログを除く)コマンド出力
active profiles = [dev]
server.port = 8084
app.greeting = from command line
AppProperties = AppProperties[greeting=from command line, maxRetryCount=1]
property sources (highest precedence first):
server.ports
configurationProperties <-- app.greeting=from command line
commandLineArgs <-- app.greeting=from command line
servletConfigInitParams
servletContextInitParams
systemProperties <-- app.greeting=from system property
systemEnvironment <-- app.greeting=from environment variable
random
Config resource 'class path resource [application-dev.properties]' via location 'optional:classpath:/' <-- app.greeting=from application-dev.properties
Config resource 'class path resource [application.properties]' via location 'optional:classpath:/' <-- app.greeting=from application.properties
applicationInfo

5名前のゆるい対応と環境変数の名前

maxRetryCount に対して、書き方の違う名前がどれも届いています(### の右がコマンドライン引数、env の行が環境変数)。環境変数は、ドットをアンダースコアにし、ダッシュを取り除き、大文字にするのがリファレンスの規則で、それに従った名前が APP_MAXRETRYCOUNT です。最後の APP_MAX_RETRY_COUNT も入りましたが、 4.1.1 で1回観測しただけで、通る条件は確かめていません。

record AppProperties(String greeting, int maxRetryCount) への束縛結果コマンド出力
###
AppProperties = AppProperties[greeting=from application.properties, maxRetryCount=1]
### --app.max-retry-count=2
AppProperties = AppProperties[greeting=from application.properties, maxRetryCount=2]
### --app.maxRetryCount=3
AppProperties = AppProperties[greeting=from application.properties, maxRetryCount=3]
### --app.max_retry_count=4
AppProperties = AppProperties[greeting=from application.properties, maxRetryCount=4]
### --APP.MAX-RETRY-COUNT=5
AppProperties = AppProperties[greeting=from application.properties, maxRetryCount=5]
env APP_MAXRETRYCOUNT=6
###
AppProperties = AppProperties[greeting=from application.properties, maxRetryCount=6]
env APP_MAX_RETRY_COUNT=7
###
AppProperties = AppProperties[greeting=from application.properties, maxRetryCount=7]

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