SpringBootって一つの事を実現する手法がいくつかあったりして初見はなかなか混乱する気がする。 application.properties周りもそんな感じで長い間混乱していたが、少し頭が整理出来てきたのでメモしておく。
参考) Spring Boot コア機能 - リファレンスドキュメント
application.propertiesの目的
SpringBootに限らずApplicationには内部に埋め込みたくない値がある。
DBの接続情報とかがそれで、内部に埋め込まず外部に用意する設定ファイルに記述することで、同じアプリケーションを異なる環境で動かすことができるようになる。
application.propertiesもそれを実現する手段の一つである。
application.propertiesに記述した値をどのように受け取るか
例えば application.propertiesに
app.name=太郎
と書いてあり、これを読み込みたい場合、
beanの定義にて
@Component public class Person() { @Value("${app.name}") prvate Sting name; }
とあれば、このPersonがDIコンテナによってインスタンス化されるときに、nameには「太郎」が入ることになる。
このように、DI時にデータをバインドさせる方法の1つとしてapplication.propertiesがあり、 これ以外にも色々方法がある。
参照) Spring Boot コア機能 - リファレンスドキュメント
補足)
外部ファイルにこだわらないのであれば、@Configurationアノテーションを使ったConfigurationClassでbeanを設定することで値を設定できる。
SpringBootで使うライブラリの設定方法について調べていると、ある記事ではapplication.propertiesを使っていたり、ある記事はConfigurationClassを使っていたり、
またある記事はxmlファイルでbean定義を書いていたり(これはSpringBootではなくSpringFrameworkの書き方?)して自分は混乱していたのだった。
application.propertiesとapplication.yaml
application.propertiesではなく、application.yamlとしてyaml形式で記述していてもSpringBootは読み込んでくれる。
ファイル配置位置
以下の場所にあれば読み込まれる。 下に記載したものほど優先される
プロファイル毎のapplication.propertiesを用意する
本番環境、開発環境で読み込みたい値が異なるケースのためにプロファイルという仕組みがある。
例えば、環境変数 SPRING_PROFILES_ACTIVEにproduction
という値が入った環境では、
application.propertiesがまず読み込まれ、それに上書きされる形でapplication-production.propertiesが読み込まれる。
※その他実行時プロファイルを指定する方法は以下のような物がある
参考) Springのプロファイル機能、そしてSpring Bootのapplication.properties - Qiita
JUnitテストクラスに @ActiveProfiles("プロファイル名") を付加する
複数指定時は配列指定 @ActiveProfiles({"profile1", "profile2"})
java コマンドに -Dspring.profiles.active=プロファイル名 を付加する
複数指定時はカンマ区切り -Dspring.profiles.active=profile1,profile2
環境変数 SPRING_PROFILES_ACTIVE にプロファイル名を指定する
複数指定時はカンマ区切り SPRING_PROFILES_ACTIVE=profile1,profile2
補足) プロファイルごとにインスタンス化するbeanの内容を変えるために、@profileでプロファイルを指定することができる。