spring-boot

Spring-Bootの設定プロパティと環境変数

More than 3 years have passed since last update.

Spring-Boot便利ですね。Springここまで進化しとったんかという感じです。

システムを作るとどうしても「設定」と「プログラム」を分離する必要が出てきます。

Javaには標準的にpropertiesファイルというやつがあるのですが、「どこからそのファイルを探すの?」というのは自前で作りこまなくてはなりません。

今日はSpring-Bootのそのへんの便利さについてです。(はっきり言って自分メモ)


読み込み優先順位の話

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config

ここに、こんな記述があります。この中から自分が興味あるのだけピックアップします。



  1. Command line arguments.

  2. JNDI attributes from java:comp/env.

  3. Java System properties (System.getProperties()).

  4. OS environment variables.

  5. A RandomValuePropertySource that only has properties in random.*.

  6. Application properties outside of your packaged jar (application.properties including 1. YAML and profile variants).

  7. Application properties packaged inside your jar (application.properties including YAML and profile variants).

  8. @PropertySource annotations on your @Configuration classes.

  9. Default properties (specified using SpringApplication.setDefaultProperties).


ちなみに上が最強で下に行くほど弱いです。


1.Command line args(コマンドライン引数)

指定の仕方は --(ハイフン2つ)をつけて、--myapp.ldap.port=10389的な指定の仕方になります。

ただし、gradle bootRunで起動するときは一工夫が必要です。(gradleに対する引数として受けられてしまう様子…)


build.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形式が好きです。

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-application-property-files



  1. A /config subdir of the current directory.

  2. The current directory

  3. A classpath /config package

  4. The classpath root


自分的には、



  1. src/main/resources/configの下にapplication.yml というファイルを入れておいてパッケージングする→これをデフォルト値とする

  2. 環境によって上書きしたいところは${配布先のディレクトリ}/config/application.ymlに書く

というのがいい感じです。


プロファイル

本番環境の設定はこうだけど、ステージング環境ではこう、という環境レベルによる設定の違いってありますよね?

その場合には、

application.yml

application-staging.yml
application-production.yml

という感じでファイルを用意します。そして起動パラメータ--spring.profiles.active=productionを指定するか、環境変数でSPRING_PROFILES_ACTIVE=productionを指定すると、


  1. application.ymlの値が適用される

  2. それを上書きする形で application-production.yml の値が適用されます。

つまり、無印のapplication.ymlに環境によらない共通設定を書いておき、プロファイル毎に違うものは-profile名.ymlのファイルを用意するという使い方になります。

参考