1素の Java で「上から順に探す」を書く
を強い順に並べたリストを作り、キーを上から探して最初に見つかった値を返すだけのプログラムです。 は使っていません。負けた値は消えずに各設定元に残っていて、先頭の設定元を外すと次の値が返ります。優先順位の正体はこの並び順です。
2application.properties とプロファイル別のファイル
実験で使った2つのファイルです。 は、 dev を有効にしたときだけ読まれ、同じキーがあれば より強くなります。dev のほうに書いていない app.max-retry-count は、application.properties の 1 がそのまま使われます。
# application.propertiesserver.port=8081app.greeting=from application.propertiesapp.max-retry-count=1# application-dev.propertiesserver.port=8082app.greeting=from application-dev.properties
3設定元を1つずつ足していく
A から E へ、設定元を1つずつ足しながら起動した結果です。足すたびに、新しく足したものの値が返っています。D で の 8085 にしたあと E で引数の 8084 が勝っているので、数字の大小ではなく設定元の順位で決まっていることが分かります。 が実際に待ち受けたポートもこの値と一致しました。
与えたもの | server.port | app.greeting---+----------------------------------------------+-------------+--------------------------------A | application.properties(8081) | 8081 | from application.propertiesB | A + プロファイル dev(dev のファイルは 8082)| 8082 | from application-dev.propertiesC | B + 環境変数 SERVER_PORT=8083 APP_GREETING=...| 8083 | from environment variableD | C + -Dserver.port=8085 -Dapp.greeting=... | 8085 | from system propertyE | D + --server.port=8084 --app.greeting=... | 8084 | from command line
4負けた値も残っている
5か所すべてに値を与えた E で、 が持つ設定元を上から並べた出力です(上ほど強い)。app.greeting は commandLineArgs、systemProperties、systemEnvironment と2つのファイルのすべてに残っていて、いちばん上のものが返っています。なお configurationProperties は他の設定元を束ねて見せる入れ物で、独立した設定元ではありません。
active profiles = [dev]server.port = 8084app.greeting = from command lineAppProperties = AppProperties[greeting=from command line, maxRetryCount=1]property sources (highest precedence first):server.portsconfigurationProperties <-- app.greeting=from command linecommandLineArgs <-- app.greeting=from command lineservletConfigInitParamsservletContextInitParamssystemProperties <-- app.greeting=from system propertysystemEnvironment <-- app.greeting=from environment variablerandomConfig resource 'class path resource [application-dev.properties]' via location 'optional:classpath:/' <-- app.greeting=from application-dev.propertiesConfig resource 'class path resource [application.properties]' via location 'optional:classpath:/' <-- app.greeting=from application.propertiesapplicationInfo
5名前のゆるい対応と環境変数の名前
maxRetryCount に対して、書き方の違う名前がどれも届いています(### の右がコマンドライン引数、env の行が環境変数)。環境変数は、ドットをアンダースコアにし、ダッシュを取り除き、大文字にするのがリファレンスの規則で、それに従った名前が APP_MAXRETRYCOUNT です。最後の APP_MAX_RETRY_COUNT も入りましたが、 4.1.1 で1回観測しただけで、通る条件は確かめていません。
###AppProperties = AppProperties[greeting=from application.properties, maxRetryCount=1]### --app.max-retry-count=2AppProperties = AppProperties[greeting=from application.properties, maxRetryCount=2]### --app.maxRetryCount=3AppProperties = AppProperties[greeting=from application.properties, maxRetryCount=3]### --app.max_retry_count=4AppProperties = AppProperties[greeting=from application.properties, maxRetryCount=4]### --APP.MAX-RETRY-COUNT=5AppProperties = 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]