Spring Bootの設定・プロパティ・プロファイルの外部化優先順位を完全解説!初心者にもわかる設定ファイルの読み込み順
生徒
「Spring Bootで設定ファイルの読み込み順ってどうなっているんですか?」
先生
「とても大事なポイントですね。Spring Bootでは、外部から設定を変更できるように、複数の方法でプロパティを指定できますが、優先順位が決まっています。」
生徒
「環境変数やコマンドライン引数、それにapplication.propertiesの設定って、どれが優先されるんですか?」
先生
「では、それぞれの優先順位を詳しく見ていきましょう!」
1. Spring Bootで使われるプロパティの外部化とは?
Spring Bootでは、アプリケーションの挙動を変更するために、設定値(プロパティ)をコードとは別に外部化して管理することができます。これを「プロパティの外部化」と呼びます。たとえば、データベースの接続情報や、アプリケーションのポート番号などを、ソースコードを変更せずに環境ごとに切り替えることができます。
この設定の柔軟性こそが、Spring Bootの最大の魅力のひとつです。
2. Spring Bootの設定方法の種類
Spring Bootでは以下のようなさまざまな方法で設定値を指定できます。
- application.properties や application.yml ファイル
- コマンドライン引数
- 環境変数(Environment Variables)
- JVMオプション(-Dオプション)
- Spring Cloud Config や Vault 等の外部コンフィグサービス
- @Value や @ConfigurationProperties アノテーション
しかし、これらがすべて同時に存在する場合、どれが優先されるのかは気になりますよね。次に、これらの優先順位について見ていきましょう。
3. Spring Bootの設定プロパティの読み込み優先順位
Spring Bootは、設定の読み込みにおいて、あらかじめ定められた優先順位に従って値を決定します。下にその一覧を紹介します。
| 優先順位(高 → 低) | 設定元 |
|---|---|
| 1 | コマンドライン引数(--server.port=8081など) |
| 2 | Javaシステムプロパティ(-Dserver.port=8082) |
| 3 | OSの環境変数(SERVER_PORT=8083) |
| 4 | Springの環境変数(Environment Abstraction) |
| 5 | application.properties や application.yml |
| 6 | デフォルトの設定値(Spring Bootが内部的に持っている値) |
つまり、同じserver.portという設定が複数の場所で定義されていた場合、最も上にある方法で指定された値が優先されます。
4. application.propertiesとapplication.ymlの読み込み順とルール
Spring Bootでは、設定ファイルとしてapplication.propertiesとapplication.ymlが利用できます。この2つが同じディレクトリに存在する場合は、application.propertiesが優先されます。
また、次の順序で設定ファイルを探していきます。
- file:./config/
- file:./
- classpath:/config/
- classpath:/
上から順に優先度が高く、同じキーが存在する場合は上の方のディレクトリの値が優先されます。
5. Springプロファイルごとの設定ファイルの切り替え
Spring Bootでは、「プロファイル」という仕組みを使って、環境ごとに設定を切り替えることができます。たとえば、開発環境用(application-dev.yml)と本番環境用(application-prod.yml)を用意しておき、実行時に切り替えることが可能です。
プロファイルを指定する方法は以下のとおりです:
--spring.profiles.active=dev
これはコマンドライン引数として指定できますし、環境変数やプロパティファイル内でも設定可能です。
6. コマンドライン引数と環境変数の使い分け
それぞれの方法には使いどころがあります。例えば、DockerコンテナでSpring Bootアプリケーションを動かすときは、環境変数を使うことが多いです。一方で、開発時や一時的に設定を変更したい場合は、コマンドライン引数が便利です。
また、-Dオプションを使ってJavaのシステムプロパティとして渡すことも可能です。
java -Dserver.port=8085 -jar myapp.jar
7. 複数の設定方法が混在したときのトラブル対策
複数の設定方法が混在すると、どれが最終的な設定値として使われているか分からなくなることがあります。そんなときは、アプリケーション起動時のログに注目しましょう。
Spring Bootは起動時に、使用されているプロパティの情報を詳細にログ出力してくれます。また、Spring Boot Actuatorの/actuator/envエンドポイントを使えば、現在の環境変数や設定値をブラウザ上で確認することも可能です。
8. 実際にapplication.propertiesと環境変数を使ってみよう
以下に、プロパティファイルと環境変数を組み合わせた簡単な例を紹介します。
# application.properties
server.port=8080
myapp.message=Hello from properties!
そして、環境変数で上書きする場合:
export MYAPP_MESSAGE="Hello from env!"
Javaコード側では次のように受け取れます。
@RestController
public class HelloController {
@Value("${myapp.message}")
private String message;
@GetMapping("/")
public String hello() {
return message;
}
}
このように、外部設定を柔軟に使い分けることで、より安全で環境に応じたアプリケーションの管理が可能になります。
Spring FrameworkやThymeleafを使った Webアプリ開発の全体像をやさしく理解したい人には、 この入門書が定番です。
Spring Framework超入門をAmazonで見る※ Amazon広告リンク