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
を使用しています。
外部設定値を取得するのが目的なのでゲッターが必要なのは当然ですが、セッターも必要です。ないとエラーになります。