SpringBootでapplication.yaml以外の外部リソースファイルを読み込む

エキサイト株式会社エンジニアの佐々木です。アプリケーションを開発していると設定が増えてくると思いますが、増えてくるとファイルが増えて大変です。また、モジュラーモノリスのような構成にすると設定を別々に管理した方が都合がいいことがでてきます。SpringBootで試してみます。

前提

SpringBoot2.4以上で使用ができます。

設定ファイルで指定する方法

下記のような database.yaml のファイルがあるとします。

database:
  host: localhost
  port: 33067
  schema: hogehogea

application.yamlファイルではないので、SpringBoot標準では読み込みません。application.yamlに次の設定を追記します。

spring:
  config:
    import: classpath:/database.yaml

上記の設定で設定を分けられます。

クラスに書く方法

設定ファイル

デフォルトのままapplication.yamlをそのまま読み込めなかったと思うので、property(.ini)ファイルにします。(factoryクラスを書けば読み込み可能です)

database.host = localhost
database.port = 3306
database.schema = hogehoge

クラスファイル

クラスファイルは下記のようになります。

@Data
@Configuration
@ConfigurationProperties(prefix = "database")
@PropertySource("classpath:database.properties")
public static class DatabaseConfig {
    private String host;
    private Integer port;
    private String schema;

    @Bean
    public DatabaseConfig databaseConfig(){
        return new DatabaseConfig();
    }
}

@PropertySourceにファイル名を書くと読み込んでくれます。アノテーションがたくさんついていますが、下記にまとめます。

@Data : lombokというライブラリを使って、Getter/Setterのメソッド等を自動的に生成してくれます
@Configuration: 設定ファイルクラスであることを明示します
@ConfigurationProperties: prefixで指定した文字列の配下とクラスのフィールド名が一致しているものにマッピングします
@PropertySource: 設定ファイルの置き場所を指定します
@Bean: DIコンテナに登録します

記述量は多くなりますね。ちなみに、@PropertySourceがデフォルトでYAMLに対応するというのは、GithubのIssueで拒否されています。(spring.config.importがでてきたから?)

まとめ

SpringBoot2.4以降は、spring.config.importを使うのが良さそうです。ニッチなネタですが、意外とソースが古かったりニーズにはずれていたりします。参考になれば幸いです。

最後に

エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを随時募集しております。長期インターンも歓迎していますので、興味があれば連絡いただければと思います。

カジュアル面談はこちらになります! meety.net

募集職種一覧はこちらになります!(カジュアルからもOK) www.wantedly.com