Spring Bootでapplication.ymlをDIするシンプルな方法

こんにちは。 エキサイト株式会社の三浦です。

Spring Bootで testproduction などのデプロイ環境ごとに異なるデータを定義したいときは、 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;
}

tech.excite.co.jp

  • その他、 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 側がかなりシンプルになったことがわかります。

最後に

この方法はJavarecord を使えるバージョンであったり、Spring Bootの一定以上のバージョンである必要があるので、必ずしもすべてのアプリケーションで使えるとは限りませんが、可能ならこちらを使うことで記述量が抑えられるのでおすすめです。