SpringBootを使っていると application.yaml
や環境変数を設定することでアプリケーションの設定を変えることができますよね? server.port
を設定すると起動するportが変えられるとかってやつです。
この記事では、SpringBootが提供するプロパティ利用する方法のほかに、独自のプロパティを定義して利用する方法をまとめます!
プロパティの一覧
SpringBootで使えるプロパティの一覧は ↓こちら↓
SpringBootでなくてもSpringBootと連携しているライブラリでも、このようなプロパティの一覧が整理されているはずです!
ただ、一覧からプロパティを探すというよりも「springboot how to change http port」とかGoogleで検索する方がやりたいことに対して情報が早く見つけられるかもしれません😅
※具体的なプロパティを見つけた後に、一覧で見つけたプロパティの近くに記載されている他のプロパティを見てみると「そんな設定もできるんだー」と勉強になることがあります。
プロパティの設定方法
application.yaml / application.properties
環境に依存しない設定は application.yaml
やapplication.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}
また、どこに何の設定がされているのか追いにくいのです。
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;
}
・共通部分を除いたキーと対応する名前でフィールド変数を定義します
・「-」のついたキーは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();
}
}
・それ以外は通常のBeanと同じ使い方です
補完機能を有効にする
SpringBootのプロパティだと、application.yamlにプロパティの一部分を入力した段階で候補が出てきます。
これを独自のプロパティでも実現するには、spring-boot-configuration-processor
を依存に追加してcompileJavaをすればOK!
dependencies {
...
// 注意: 「annotationProcessor」で依存を追加すること!!!
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
}
🎉🎉🎉
アプリケーションではどちらでもいいかもですが、ライブラリでは「@ConfigurationProperties」でないと利用者側がspring-boot-configuration-processorの恩恵が受けられないので「@ConfigurationProperties」を使う方が良いと思います!
(META-INF/spring-configuration-metadata.jsonを自前で作成すれば別です)