Spring Bootで設定ファイル(yaml)を読み込む方法

Spring Bootでyaml形式の設定ファイルを読み込む方法です。

Spring Bootで設定ファイル(yaml)を読み込む方法

プロジェクトに必要な設定を書いた外部定義ファイルを用意し、それを読み込んで使うって一般的なことですね。ログの出力先とか、データベースの接続先とか、必要なものっていっぱいあります。

コンテキストルートの config に application.properties を作成しても同じですが、yaml の書き方が好きなので、今回は yaml での設定方法と、読み込み方法を紹介します。

ここでは Spring Bootでyaml形式の設定ファイルを読み込む方法 を紹介します。


環境

application.ymlを作成

src/main/resources の中に config フォルダを作って application.yml を作ります。

サンプルとして下記を記述します。


# spring.profiles.activeにアクティブなプロファイルを指定する
spring:
  profiles:
    active: dev

# "---"でプロファイルを区切る
# spring.profilesにプロファイル名を書く
---
spring:
  profiles: dev
users:
 id: saka-en-dev
 name: サカエン開発
---
spring:
  profiles: production
users:
 id: saka-en-pro
 name: サカエン本番

spring.profiles.active でアクティブなプロファイルを切り替えます。"---"でプロファイルを区切ることで、開発用とか本番用とかに定義を分けてを記述できます。

もちろん、ファイル自体を分けて管理することもできます。

Spring Boot application.ymlは環境によって分ける

上図のように、共通となる設定は application.yml に記述し、開発・テスト・本番の環境など、application 以降を "-" で区切って、spring.profiles に設定した名前を付けましょう。そして application.yml に記述した spring.profiles.active でアクティブなプロファイルを切り替えます。

application.ymlを読み込む

application.yml から定義値を読み込みます。まずは読み込んだ値を格納するクラスを作りましょう。作ったクラスには「@ConfigurationProperties」アノテーションを付与します。

Lombok を使用することで getter / setter を省略しています。


package springbootapp;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import lombok.Data;

@Data
@Component
@ConfigurationProperties(prefix="users")
public class UserConfig {
  private String id;
  private String name;
}

次に、定義ファイルの値を返却するクラスを作成します。


package springbootapp;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import lombok.Getter;

@Getter
@Component
public class ConfigReader {
  @Autowired
  private UserConfig logConf;
}

最後に、エントリーポイントのクラスに記述します。「@Autowired」アノテーションを付与し、先ほど作成したコンポーネントをインジェクションします。


@Autowired
private UserConfig userConf;
@Override
public void run(String...args) {
  System.out.println(userConf.getId());
  System.out.println(userConf.getName());
}

今回はフィルターの構成クラスに記述したので、こんな感じになりました。


package springbootapp;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

  @Autowired
  private UserConfig userConf;

  @Bean
  public FilterRegistrationBean filter1() {
    System.out.println(userConf.getId());
    System.out.println(userConf.getName());
    FilterRegistrationBean bean = new FilterRegistrationBean();
    bean.setFilter(new LoggingFilter1());
    bean.setOrder(2);
    return bean;
  }

  @Bean
  public FilterRegistrationBean filter2() {
    FilterRegistrationBean bean = new FilterRegistrationBean();
    bean.setFilter(new LoggingFilter2());
    bean.setOrder(1);
    return bean;
  }
}

早速、実行してみましょう。

"spring.profiles.active=dev" の場合


2016-11-21 17:08:27.508  INFO 7728 --- [           main] springbootapp.App                        : The following profiles are active: dev
・・・中略・・・
saka-en-dev
サカエン開発

"spring.profiles.active=production" の場合


2016-11-21 17:09:57.522  INFO 10040 --- [           main] springbootapp.App                        : The following profiles are active: production
・・・中略・・・
saka-en-pro
サカエン本番

おおお、きちんと切り替わりましたねー^^

ちなみにコマンドで起動する場合は、以下のように jar の起動オプションに「--spring.profiles.active=production」とすれば本番環境で起動できます。


java -jar (アプリ名).jar --spring.profiles.active=production

jar 起動でエラーが出た方はこちらを参考にしてください。

まとめ

Spring Bootでyaml形式の設定ファイルを読み込む方法を紹介しました。

開発・本番で環境が違うことで、様々なパラメータを外出して管理するというのは、どのプロジェクトにも共通のことだと思います。これが手軽に実現できるってのは、生産性向上+メンテ性向上にもつながりますね。

皆さんも試してみてください。

次はデータベース周りを検証しましょうかね。

おつかれさまでした。

この記事がお役に立ちましたら シェア をお願いいたします。