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