山崎屋の技術メモ

IT業界で働く中でテクノロジーを愛するSIerのシステムエンジニア👨‍💻 | AndroidとWebアプリの二刀流🧙‍♂️ | コードの裏にあるストーリーを綴るブログ執筆者✍️ | 日々進化するデジタル世界で学び続ける探究者🚀 | #TechLover #CodeArtisan、気になること、メモしておきたいことを書いていきます。

Spring Boot 独自のプロパティを定義して使う

ソース本体にハードコーディングしたくない設定値は外部ファイルに定義しておくのがプログラミングの基本です。例えば DB 接続情報や消費税率、パフォーマンス調整用の値などがありますね。

今回はフレームワーク Spring Boot を使用して、application.properties に独自のプロパティを登録し、それを使用するまでをメモしておきたいと思います。

こちらの記事に外部設定値の扱い方が詳しく書かれています。
Spring Bootの外部設定値の扱い方を理解する - Qiita

上記ページで紹介されている @Value を使用して、一番簡単な取得方法を説明していきたいと思います。

プロジェクトの作成

Spring Starter Project を使用して、プロジェクトを作成しますが、シンプルなプロジェクトにしたいので依存性には何も指定せず Finish ボタンをクリックします。プロジェクト名は「sample」としました。

f:id:yyama1556:20190103134508p:plain

これでシンプルなコマンドラインアプリケーションが作成されます。
 
 

プロパティの登録

デフォルトでは、application.properties には何も登録されていません。

ここに独自のプロパティを登録します。例では「org.yyama.hoge=hello! properties!」を登録しています。

org.yyama.hoge=hello! properties!


プロパティの使用

@Value を使用してクラスのフィールドに設定を読み込みます。

SampleApplication クラスを修正しました。

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 prop;

	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("prop : " + prop);
	}
}

実行すると Spring 標準のログの後に、「hello! properties!」と表示されることが確認できました。

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.1.RELEASE)

2019-01-03 13:56:59.962  INFO 8892 --- [           main] org.yyama.SampleApplication              : Starting SampleApplication on yyama-PC with PID 8892 (C:\workspace\sample\target\classes started by yyama in C:\workspace\sample)
2019-01-03 13:56:59.966  INFO 8892 --- [           main] org.yyama.SampleApplication              : No active profile set, falling back to default profiles: default
2019-01-03 13:57:00.586  INFO 8892 --- [           main] org.yyama.SampleApplication              : Started SampleApplication in 1.005 seconds (JVM running for 1.928)
prop : hello! properties!


コンストラクタ処理内ではこのプロパティはまだ初期化されていません(参照すると null が返ってきます)ので注意してください。
 

application.properties にワーニングが出ているんですけど

プログラムは問題なく動くのですが、プロパティファイルにワーニングが出ていることに気づくと思います。
f:id:yyama1556:20190103140228p:plain

「org.yyama.hoge」の箇所に「'org.yyama.hoge' is an unknown property.」というワーニングが出ています。「そんなプロパティ知らないよ」ということですね。

ワーニングメッセージの後に解決案( quickfixes )が 3 つ提示されており、一番上のメタデータ作成を選んでみます。
f:id:yyama1556:20190103140646p:plain

メタデータ作成ダイアログが表示されますので、メタデータをおきたいリソースファイルを選択します。ここでは「/sample/src/main/resources」を選択して OK を押しました。
f:id:yyama1556:20190103140916p:plain

META-INF フォルダおよび additional-spring-configuration-metadata.json ファイルが自動で作成され、ワーニングが消えました。
f:id:yyama1556:20190103142114p:plain

作られた json ファイルを見ると org.yyama.hoge プロパティのメタ情報が登録されています。

{"properties": [{
  "name": "org.yyama.hoge",
  "type": "java.lang.String",
  "description": "A description for 'org.yyama.hoge'"
}]}


この json ファイルがあると、application.properties の編集中に ctrl + space で独自プロパティのコード補完も効くようになります。
 

まとめ

application.properties ファイルに独自のプロパティ定義とその利用方法、およびそのプロパティのメタ情報登録までを行いました。
 
他のブログでもプロパティファイルの利用方法は紹介されています。いろいろな方法があるようですが、この記事では自分が知る中で、一番簡単な方法を紹介しました。

次回はシステム環境変数の取得方法について紹介したいと思います。
Spring Boot 環境変数の取得 - 山崎屋の技術メモ

それでは!

Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発

Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発

現場至上主義 Spring Boot2 徹底活用

現場至上主義 Spring Boot2 徹底活用

Spring Boot 2 プログラミング入門

Spring Boot 2 プログラミング入門