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