Spring-Boot便利ですね。Springここまで進化しとったんかという感じです。
システムを作るとどうしても「設定」と「プログラム」を分離する必要が出てきます。
Javaには標準的にpropertiesファイルというやつがあるのですが、「どこからそのファイルを探すの?」というのは自前で作りこまなくてはなりません。
今日はSpring-Bootのそのへんの便利さについてです。(はっきり言って自分メモ)
読み込み優先順位の話
ここに、こんな記述があります。この中から自分が興味あるのだけピックアップします。
- Command line arguments.
- JNDI attributes from java:comp/env.
- Java System properties (System.getProperties()).
- OS environment variables.
- A RandomValuePropertySource that only has properties in random.*.
- Application properties outside of your packaged jar (application.properties including 1. YAML and profile variants).
- Application properties packaged inside your jar (application.properties including YAML and profile variants).
- @PropertySource annotations on your @Configuration classes.
- Default properties (specified using SpringApplication.setDefaultProperties).
ちなみに上が最強で下に行くほど弱いです。
1.Command line args(コマンドライン引数)
指定の仕方は --(ハイフン2つ)をつけて、--myapp.ldap.port=10389
的な指定の仕方になります。
ただし、gradle bootRun
で起動するときは一工夫が必要です。(gradleに対する引数として受けられてしまう様子…)
bootRun {
if (project.hasProperty('args')) { // "args" というプロパティが渡されていたら
args project.args.split('\\s+') // 空白文字で split して、 run タスクの args オプションにセットする
}
}
$ ./gradlew bootRun -Pargs="--myapp.ldap.port=10389"
参考
4. OS environment variables(OSの環境変数)
$ export MYAPP_LDAP_PORT=10389
これは--myapp.ldap.port=10389
と同じ設定になります。
大文字のスネークケース(_区切り)にすればいいということですね。
6,7 application.yml
properties形式は使いにくいのでYAML形式が好きです。
- A /config subdir of the current directory.
- The current directory
- A classpath /config package
- The classpath root
自分的には、
-
src/main/resources/config
の下にapplication.yml というファイルを入れておいてパッケージングする→これをデフォルト値とする - 環境によって上書きしたいところは
${配布先のディレクトリ}/config/application.yml
に書く
というのがいい感じです。
プロファイル
本番環境の設定はこうだけど、ステージング環境ではこう、という環境レベルによる設定の違いってありますよね?
その場合には、
application.yml
application-staging.yml
application-production.yml
という感じでファイルを用意します。そして起動パラメータ--spring.profiles.active=production
を指定するか、環境変数でSPRING_PROFILES_ACTIVE=production
を指定すると、
- application.ymlの値が適用される
- それを上書きする形で application-production.yml の値が適用されます。
つまり、無印のapplication.ymlに環境によらない共通設定を書いておき、プロファイル毎に違うものは-profile名.ymlのファイルを用意するという使い方になります。
参考