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 Bootの設定、プロパティ、プロファイル、外部化の優先順位を理解しておくと、開発環境、本番環境、検証環境などで設定値を安全に切り替えられるようになります。Spring Bootでは、アプリケーションのポート番号、データベース接続情報、メッセージ、ログ設定、外部サービスの接続先などを、ソースコードの中に直接書かず、application.propertiesやapplication.yml、環境変数、コマンドライン引数、Javaシステムプロパティなどで管理できます。このように設定を外に出して管理する考え方が、プロパティの外部化です。
特に大切なのは、同じ設定キーが複数の場所に書かれている場合、どの値が最終的に使われるのかを知っておくことです。Spring Bootでは、コマンドライン引数、Javaシステムプロパティ、環境変数、Springの環境変数、application.propertiesやapplication.yml、デフォルト値というように、設定の読み込み優先順位があります。例えばserver.portを複数の場所で指定した場合、優先順位の高い場所に書かれた値が採用されます。
application.propertiesとapplication.ymlは、Spring Boot初心者が最初に触れることが多い設定ファイルです。同じディレクトリに両方がある場合は、application.propertiesが優先されます。また、設定ファイルを置く場所にも優先順位があり、外部のconfigディレクトリ、外部のカレントディレクトリ、classpath内のconfigディレクトリ、classpath直下という順番で探されます。これを知らないと、設定したはずの値が反映されない、ポート番号が変わらない、環境変数で上書きしたと思ったのに動作が違う、というトラブルにつながります。
Springプロファイルを使うと、開発環境と本番環境で設定ファイルを切り替えることができます。例えば開発用はapplication-dev.yml、本番用はapplication-prod.ymlとして用意しておき、spring.profiles.activeでdevやprodを指定します。これにより、開発中はローカルデータベースへ接続し、本番では本番データベースへ接続するような切り替えができます。Spring Bootのプロファイルは、環境ごとに安全に設定を分けるための重要な仕組みです。
Dockerやクラウド環境では、環境変数を使って設定値を渡すことがよくあります。一方、開発時に一時的にポート番号を変えたい場合や、動作確認のために値を上書きしたい場合は、コマンドライン引数やJavaシステムプロパティが便利です。どの方法を使うかは、運用方法や環境によって変わりますが、優先順位を理解しておけば、設定が衝突したときにも原因を探しやすくなります。
設定が思った通りに反映されない場合は、起動時のログを確認することが大切です。また、Spring Boot Actuatorを使えば、現在の環境変数やプロパティ値を確認できます。設定ファイル、環境変数、プロファイル、コマンドライン引数の関係を整理しておくことで、Spring Bootアプリケーションの管理がしやすくなり、実務でも安全で柔軟な構成を作れるようになります。
application.propertiesで設定値を管理する例
Spring Bootでは、まずapplication.propertiesに基本設定を書くことが多いです。ポート番号やアプリケーション独自のメッセージを設定しておくと、Javaコードを変更せずに動作を変えられます。
server.port=8080
myapp.message=こんにちは、設定ファイルから読み込んだメッセージです
Javaコードでプロパティを受け取る例
設定ファイルに書いた値は、Java側で受け取って利用できます。画面に表示する文言や、アプリケーションの動作を切り替える値として使うと、変更に強い構成になります。
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MessageController {
@Value("${myapp.message}")
private String message;
@GetMapping("/")
public String index() {
return message;
}
}
こんにちは、設定ファイルから読み込んだメッセージです
プロファイルで環境ごとに設定を切り替える例
開発環境と本番環境で設定を分けたい場合は、Springプロファイルを使います。開発用の設定、本番用の設定を分けておくことで、環境ごとの設定ミスを減らせます。
application-dev.properties
application-prod.properties
--spring.profiles.active=dev
このように指定すると、開発用のプロファイルが有効になります。実務では、ローカル開発、テスト環境、本番環境でデータベース接続先やログレベルを変えることが多いため、プロファイルの使い方を覚えておくと便利です。
生徒
「Spring Bootの設定は、application.propertiesだけでなく、環境変数やコマンドライン引数でも指定できるんですね。」
先生
「はい。Spring Bootは設定を外部化できるので、ソースコードを変更しなくても環境ごとに動作を切り替えられます。これは実務のWebアプリケーション開発ではとても重要です。」
生徒
「でも、同じserver.portをいろいろな場所に書いたら、どれが使われるのか分からなくなりそうです。」
先生
「そのために優先順位を理解しておく必要があります。コマンドライン引数は優先順位が高く、application.propertiesやapplication.ymlよりも優先されます。環境変数やJavaシステムプロパティも、設定の上書きでよく使われます。」
生徒
「application.propertiesとapplication.ymlが両方ある場合は、application.propertiesが優先されるんですね。」
先生
「その通りです。また、設定ファイルを置く場所にも優先順位があります。外部のconfigディレクトリに置いた設定は、classpath内の設定よりも優先されます。デプロイ後に外部ファイルで設定を切り替えたい場合に便利です。」
生徒
「Springプロファイルは、開発環境と本番環境を切り替えるための仕組みなんですね。」
先生
「はい。application-dev.propertiesやapplication-prod.propertiesを用意して、spring.profiles.activeで切り替えます。開発環境ではローカルの設定、本番環境では本番用の設定を使うことで、安全に運用できます。」
生徒
「Dockerやクラウド環境では環境変数をよく使うという話も印象に残りました。」
先生
「環境変数は、実行環境ごとに値を変えやすいので、コンテナやクラウドとの相性が良いです。一方で、開発時に一時的に設定を変えたい場合は、コマンドライン引数やJavaシステムプロパティも便利です。」
生徒
「設定が反映されないときは、どこを見ればいいですか?」
先生
「まずは起動ログを確認しましょう。さらにSpring Boot Actuatorのenvエンドポイントを使うと、現在のプロパティや環境変数を確認できます。設定の読み込み順を知っていると、原因を切り分けやすくなります。」
生徒
「Spring Bootの設定ファイル、外部化、プロファイル、環境変数、コマンドライン引数の関係が整理できました。」
先生
「とても良い理解です。Spring Bootの設定管理は、アプリケーションを安全に運用するための土台です。読み込み優先順位を意識して、環境ごとに分かりやすく管理できるようにしていきましょう。」