Webエンジニアのメモ帳

技術的な話を中心に書いています。

【Spring】application.ymlから値を読み込む方法

Springを使った開発では、src/main/resources/application.ymlに外部設定値を記載することが多いですが、この値をコード中で利用する方法を2つ説明します。

@Valueを利用する方法

application.ymlに以下が記載されているとします。

api:
  hostname: "http://sample-api.co.jp"
  timeout: 5

application.propertiesを使う場合は、以下のような記述ですね。

api.hostname="http://sample-api.co.jp"
api.timeout=5

これをJavaのコードで読み込むには、以下のように記述します。

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Service
public class RequestToApiService {
  @Value("${api.hostname}")
  private String hostname;

  @Value("${api.timeout}")
  private int timeout;

  // 以下メソッドなどを記述
}

@Valueというアノテーションを付けるだけです。とても簡単ですね。

注意点として、@ValueというアノテーションLombokなどにもありますから、import文の記述を間違わないようにしてください。

@ConfigurationPropertiesを利用する方法

こちらは、ymlの値を保持するクラスを作成する方法です。

同じくapplication.ymlが以下のような内容だとします。

api:
  hostname: "http://sample-api.co.jp"
  timeout: 5

この時、以下のようなクラスを作成します。

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "api")
public class ApiProperties {
  private String hostname;
  private int timeout;
}

このクラスをサービス層などで使うような形です。

こちらの方法を使うとクラスが増えますが、保持する値が多い場合や、複数のクラスでapplication.ymlの値を参照する場合などには便利です。

また、ApiPropertiesクラスをモック化できるため、テストコードが書きやすくなるというメリットがあります。

なお、上記のコードではゲッターとセッターを楽に書くため、Lombok@Getter@Setterを使用しています。

外部設定値を取得するのが目的なのでゲッターが必要なのは当然ですが、セッターも必要です。ないとエラーになります。