こんにちは。 エキサイト株式会社の三浦です。
Spring Bootで test
や production
などのデプロイ環境ごとに異なるデータを定義したいときは、 application.yml
ファイルに定義することが多いでしょう。
今回は、 application.yml
から値を取得するシンプルな方法を紹介します。
application.yml とは
application.yml
は、主に環境ごとに異なるデータを定義したり、各種ライブラリが使用するデータを定義するためのYAML形式のファイルです。
例えばDatabaseの接続情報やSpring Bootのログ出力レベルなどを定義することで、それらを使用してDBに接続したりログ出力レベルを環境ごとに変更することができます。
ライブラリによっては、指定階層にデータを定義することで自動的に読み込んでもらうことも可能ですが、開発者側で独自にデータを定義することも可能です。
独自定義の場合は、当然開発者側でデータの取得処理を書く必要がありますが、これにはいくつかの方法があります。
application.ymlを読み込む方法
application.yml
を読み込む方法としては以下のようなものがあります。
ConfigurationPropertiesScan
,RequiredArgsConstructor
,ConstructorBinding
,ConfigurationProperties
等を併用してクラスでDIする方法
@SpringBootApplication @ConfigurationPropertiesScan // ConfigurationPropertiesを読みにいくおまじない public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
@Getter @RequiredArgsConstructor @ConstructorBinding // この設定がないと Setterが必要になるのでつけておく @ConfigurationProperties(prefix = "env") // prefixで指定された部分のyamlを読みいく public class Config { private final String host; private final Integer port; }
- その他、
Value
を使って個別にデータを取得する方法
ですが実は、クラスでDIする方法については、さらにシンプルな方法があります。
それは、以下のように record
を使う方法です。
@SpringBootApplication @ConfigurationPropertiesScan // ConfigurationPropertiesを読みにいくおまじない public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
@ConfigurationProperties(prefix = "env") // prefixで指定された部分のyamlを読みいく public record Config(String host, Integer port) {}
Java実行ファイルでは同じ定義が必要になりますが、実際にデータを取得する record
側がかなりシンプルになったことがわかります。
最後に
この方法はJavaが record
を使えるバージョンであったり、Spring Bootの一定以上のバージョンである必要があるので、必ずしもすべてのアプリケーションで使えるとは限りませんが、可能ならこちらを使うことで記述量が抑えられるのでおすすめです。