【SpringBoot ~入門編~】プロパティの使い方

SpringBootを使っていると application.yamlや環境変数を設定することでアプリケーションの設定を変えることができますよね? server.portを設定すると起動するportが変えられるとかってやつです。

この記事では、SpringBootが提供するプロパティ利用する方法のほかに、独自のプロパティを定義して利用する方法をまとめます!

プロパティの一覧

SpringBootで使えるプロパティの一覧は ↓こちら↓

SpringBootでなくてもSpringBootと連携しているライブラリでも、このようなプロパティの一覧が整理されているはずです!

ただ、一覧からプロパティを探すというよりも「springboot how to change http port」とかGoogleで検索する方がやりたいことに対して情報が早く見つけられるかもしれません😅

※具体的なプロパティを見つけた後に、一覧で見つけたプロパティの近くに記載されている他のプロパティを見てみると「そんな設定もできるんだー」と勉強になることがあります。

プロパティの設定方法

application.yaml / application.properties

環境に依存しない設定は application.yamlapplication.propertiesで行います。

配置場所は src/main/resources直下です。

例えば server.portを8081に設定する場合は以下のように記述します。

server:
  port: 8081
server.port=8081

環境変数

環境に依存する設定は環境変数で設定ができます。

例えば server.portを環境変数で設定した場合は、

SERVER_PORT=8081

のようにします。

メモ
プロパティ→環境変数は以下のルールで変換する必要があります
・「.」「-」は「_」に
・camel caseはsnake caseに(例:hogeHoge → hoge_hoge)
・文字をすべて大文字に(これは任意で、大文字か小文字かがチームで揃っていればOK)

個人的ベストプラクティス

実際に何年か運用していてのオススメは、application.yamlと環境変数とを以下のように組み合わせることです。

application.yamlでは ${環境変数:デフォルト値}という形式で、環境変数が定義されていればその値を、定義されていなければデフォルトの値をという記述ができ、これを使います。

server:
  port: ${SERVER_PORT:8081}
  # デフォルトを設定しない場合
  # port: ${SERVER_PORT}

なぜyaml?
yaml形式だと、自然と関連設定が1箇所にまとまるのでどこに何が設定されているのか把握しやすいです!

ファイルと環境変数と使い分ければ良いのでは?
環境変数だけで定義していると、springbootのバージョンが変わった時にプロパティのパスが変わっても対応が漏れる可能性があります。(yamlで記載していればライブラリで検知可能。)
また、どこに何の設定がされているのか追いにくいのです。
appcalition.yamlと環境変数を組み合わせることで「まずはapplication.yamlを見てみる。環境変数が記載されていたら別途環境変数の定義を探してみる。」とapplication.yamlを起点に追うことができます!
あと、プロパティと環境変数名を対応させる必要がないので、わかりやすいように任意の環境変数で定義できたりします!

独自プロパティの定義

独自でプロパティを定義したい場合は @ConfigurationPropertiesを使います。

ここではbasis認証のかかったAPIへの接続情報として「rootUri」「username」「password」を設定できるようにしたいものとして進めます。

まずはプロパティのキーを決めます。今回はキーをcustom-props.sample-apiとします。
application.yamlで定義すると以下のようになるイメージです。

custom-props:
  sample-api:
    root-uri: <URL>
    username: <ユーザ名>
    password: <パスワード>

次に設定を読み込むJavaクラスを定義します。

@Data
@ConfigurationProperties("custom-props.sample-api")
public class SampleProperties {
    private String rootUri;
    private String username;
    private String password;
}

ポイント
・ConfigurationPropertiesの引数にはプロパティのキーのうち共通部分を設定します
・共通部分を除いたキーと対応する名前でフィールド変数を定義します
・「-」のついたキーはcamel caseに直す必要があります

最後に作成したJavaクラスを設定値が必要な箇所でinjectします。

@Configuration
@EnableConfigurationProperties(SampleProperties.class)
public class SampleAutoConfiguration {
    @Bean
    public RestTemplate restTemplate(SampleProperties properties) {
        return new RestTemplateBuilder()
                .basicAuthentication(properties.getUsername(), properties.getPassword())
                .rootUri(properties.getRootUri())
                .build();
    }
}

メモ
・EnableConfigurationPropertiesでConfigurationPropertiesクラスを指定する必要があります
・それ以外は通常のBeanと同じ使い方です

補完機能を有効にする

SpringBootのプロパティだと、application.yamlにプロパティの一部分を入力した段階で候補が出てきます。

IDE:Intelij

これを独自のプロパティでも実現するには、spring-boot-configuration-processorを依存に追加してcompileJavaをすればOK!

dependencies {
  ...
  // 注意: 「annotationProcessor」で依存を追加すること!!!
	annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
}
IDE:Intelij

🎉🎉🎉

@ConfigurationProperties VS @Value
@Valueでもプロパティを読み込むことができます。
アプリケーションではどちらでもいいかもですが、ライブラリでは「@ConfigurationProperties」でないと利用者側がspring-boot-configuration-processorの恩恵が受けられないので「@ConfigurationProperties」を使う方が良いと思います!
(META-INF/spring-configuration-metadata.jsonを自前で作成すれば別です)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です