Spring Bootで設定ファイル(yaml)を読み込む方法
Spring Bootでyaml形式の設定ファイルを読み込む方法です。
プロジェクトに必要な設定を書いた外部定義ファイルを用意し、それを読み込んで使うって一般的なことですね。ログの出力先とか、データベースの接続先とか、必要なものっていっぱいあります。
コンテキストルートの config に application.properties を作成しても同じですが、yaml の書き方が好きなので、今回は yaml での設定方法と、読み込み方法を紹介します。
ここでは Spring Bootでyaml形式の設定ファイルを読み込む方法 を紹介します。
Sponsored Links
環境
- Spring Boot 1.4.1
- Thymeleaf 3.0.2
- Windows7
- Java8
- Eclipse 4.6 Neon
こちらのページを参考にサンプルアプリを作ってください。既にSpring Bootのアプリがある場合は、読み飛ばして結構です。
Sponsored Links
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 でアクティブなプロファイルを切り替えます。"---"でプロファイルを区切ることで、開発用とか本番用とかに定義を分けてを記述できます。
もちろん、ファイル自体を分けて管理することもできます。
上図のように、共通となる設定は 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 起動でエラーが出た方はこちらを参考にしてください。
Sponsored Links
まとめ
Spring Bootでyaml形式の設定ファイルを読み込む方法を紹介しました。
開発・本番で環境が違うことで、様々なパラメータを外出して管理するというのは、どのプロジェクトにも共通のことだと思います。これが手軽に実現できるってのは、生産性向上+メンテ性向上にもつながりますね。
皆さんも試してみてください。
次はデータベース周りを検証しましょうかね。
おつかれさまでした。
Sponsored Links