前回、Spring Boot でファイルに定義されたプロパティの使用方法を紹介しました。
Spring Boot 独自のプロパティを定義して使う - 山崎屋の技術メモ
今回は、システムの環境変数に定義された値を取得する方法を紹介します。
結論から言うとプロパティファイルに定義した場合と同じ方法で取得しますが、ちょっと気をつけないといけないこともあります。
環境変数の値を取得
まず、環境変数に値を定義します。サンプルとして次のようにしました。
環境変数を定義したとき、すでに Eclipse が起動している場合は再起動しないと読み込めません。
Java 側で次のように「${org.yyama.hoge}」でこの環境変数が取得できます。
package org.yyama; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication public class SampleApplication { @Value("${org.yyama.hoge}") private String property; public static void main(String[] args) { ConfigurableApplicationContext ctx = SpringApplication.run(SampleApplication.class, args); SampleApplication sa = ctx.getBean(SampleApplication.class); sa.run(); } private void run() { System.out.println(property); } }
環境変数の名前「ORG_YYAMA_HOGE」のアンダースコアをドットにして全て小文字にする必要があるので注意してください。このあたりが詳しいです。
Spring Bootで環境変数を使ってパラメータをセットする時の項目名の解釈 - Qiita
ただし、ためしに「${ORG_YYAMA_HOGE}」で取得してみたら、正しく取得できたので、どちらでも良いでしょう。プロジェクトごとに統一しておきましょう。
出力結果です。Spring Boot の標準のログの後に「hello! environment variable!」と出力されているのが確認できます。
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.1.1.RELEASE) 2019-01-04 10:41:35.747 INFO 1016 --- [ main] org.yyama.SampleApplication : Starting SampleApplication on yyama-PC with PID 1016 (C:\workspace\sample\target\classes started by yyama in C:\workspace\sample) 2019-01-04 10:41:35.757 INFO 1016 --- [ main] org.yyama.SampleApplication : No active profile set, falling back to default profiles: default 2019-01-04 10:41:36.614 INFO 1016 --- [ main] org.yyama.SampleApplication : Started SampleApplication in 1.414 seconds (JVM running for 2.819) hello! environment variable!
プロパティファイルの値と名前がコンフリクトした場合
では今回のプロジェクトの「application.properties」に「org.yyama.hoge」のプロパティが定義されていた場合、「@Value("${org.yyama.hoge}")」でシステム環境変数とプロパティファイルのどちらが優先されるか実験してみました。
application.properties です。
org.yyama.hoge=hello! property!
そのほかは変えずに実行してみた結果です。
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.1.1.RELEASE) 2019-01-04 10:49:21.135 INFO 6224 --- [ main] org.yyama.SampleApplication : Starting SampleApplication on yyama-PC with PID 6224 (C:\workspace\sample\target\classes started by yyama in C:\workspace\sample) 2019-01-04 10:49:21.141 INFO 6224 --- [ main] org.yyama.SampleApplication : No active profile set, falling back to default profiles: default 2019-01-04 10:49:21.990 INFO 6224 --- [ main] org.yyama.SampleApplication : Started SampleApplication in 1.42 seconds (JVM running for 2.702) hello! environment variable!
前回の実行と同じです。環境変数が優先されるようですね。このあたりはこの記事を参照してください。
Spring Bootの外部設定値の扱い方を理解する - Qiita
まとめ
Spring Boot を使用したプロパティファイルに定義された値の取得に続き、今回は環境変数の値の取得方法を紹介しました。
AWS や Twitter API のアクセスキーなどは、間違えて GitHub に公開しないようシステムの環境変数で管理するようにしましょう。
Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発
- 作者:株式会社NTTデータ
- 出版社/メーカー: 翔泳社
- 発売日: 2016/07/21
- メディア: 大型本
- 作者:田村達也
- 発売日: 2018/09/08
- メディア: Kindle版
「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか
- 作者:小森 裕介
- 出版社/メーカー: 技術評論社
- 発売日: 2010/04/10
- メディア: 大型本