SpringBoot3各種配置的優(yōu)先級對比小結
Spring Boot 的核心設計之一是“約定優(yōu)于配置”(Convention Over Configuration),這使得它能夠根據(jù)默認值和用戶提供的配置快速啟動應用程序。然而,在實際開發(fā)中,應用的配置可能來自多個來源。理解這些配置來源的優(yōu)先級非常重要,以便在配置沖突時確保程序按預期運行。
本文將詳細介紹 Spring Boot 3 中的各種配置來源及其優(yōu)先級,并提供實際案例和最佳實踐。
1. 配置優(yōu)先級概述
Spring Boot 3 的配置有以下幾種來源(按照優(yōu)先級從高到低排列):
命令行參數(shù)
java -D 系統(tǒng)屬性
環(huán)境變量
application.properties 或 application.yml
- 位于
src/main/resources中的默認配置 - 外部配置文件
Profile-specific 配置
application-{profile}.properties或application-{profile}.yml@PropertySource注解
默認屬性
2. 各種配置來源的優(yōu)先級詳解
為了方便展示各種配置來源的優(yōu)先級,下面將采用優(yōu)先級從低到高的順序依次展示各種配置的生效情況。
2.1 默認屬性(最低優(yōu)先級)
當啟動項目沒有提供某個屬性時,則使用 Spring Boot 的默認值。
示例:如果未配置 server.port,則使用默認端口 8080。

2.2 @PropertySource 注解
通過 @PropertySource 注解加載的配置文件優(yōu)先級較低,但可以用于加載自定義的配置文件。
示例:
在 src/main/resources 目錄下創(chuàng)建 custom.properties 文件:
server.port=8081
創(chuàng)建一個配置類,用 @PropertySource 加載自定義配置文件。
@Configuration
@PropertySource("classpath:custom.properties")
public class CustomConfig {
}
啟動項目,服務端口為自定義配置的8081。

2.3 配置文件(application.properties 或 application.yml)
application.properties 或 application.yml 是最常用的配置來源。它們可以存在于 src/main/resources 中,也可以作為外部文件。
加載順序:
- 外部文件優(yōu)先于內部文件(
src/main/resources)。 - 文件名以
application開頭,默認加載application.properties或application.yml。 - 位置從高到低優(yōu)先級排序:
當前目錄
/config子目錄JAR 包根目錄
示例:
server: port: 8082

2.4 Profile-specific 配置
Spring Boot 支持根據(jù) Profile 加載特定的配置文件,例如 application-prod.yml 或 application-dev.yml,這種方式可以幫助開發(fā)者輕松管理和切換開發(fā)、測試、生產等不同環(huán)境的配置。
默認未激活 Profile 情況下, application.yml 優(yōu)先級高于 application-dev.yml。

激活 Profile 的方式:
命令行參數(shù):
java -jar app.jar --spring.profiles.active=prod
環(huán)境變量:
export SPRING_PROFILES_ACTIVE=prod
配置文件中設置:
spring: profiles: active: prodIDEA配置 Active profiles:

優(yōu)先級:Profile-specific 文件的配置優(yōu)先于 application.yml


使用場景:
- 根據(jù)環(huán)境動態(tài)加載不同的配置。
2.5 環(huán)境變量
操作系統(tǒng)級別的環(huán)境變量優(yōu)先于配置文件,但低于命令行參數(shù)和系統(tǒng)屬性。
示例:在 Linux/Mac 上設置環(huán)境變量:
export SERVER_PORT=8084
在 Windows 上設置環(huán)境變量:
set SERVER_PORT=8084
或 IDEA設置環(huán)境變量

啟動應用后,Spring Boot 會自動解析環(huán)境變量 SERVER_PORT 并將其映射到 server.port 屬性。

注意: 環(huán)境變量的名稱為大寫字母,并用下劃線 _ 替代點 .。
使用場景:
- 為容器化部署(如 Docker)提供靈活的配置。
- 使用 CI/CD 工具注入環(huán)境變量。
2.6 系統(tǒng)屬性(java -D)
通過 JVM 參數(shù) -D 傳遞的系統(tǒng)屬性次于命令行參數(shù),但優(yōu)先于其他來源。
示例:
java -Dserver.port=8085 -jar app.jar
或者通過 IDEA 設置 JVM 參數(shù):
-Dserver.port=8085

此命令會將 server.port 設置為 8085:

使用場景:
- 提供全局系統(tǒng)屬性配置。
- 部署時設置 JVM 級別的變量。
2.7 命令行參數(shù)(最高優(yōu)先級)
通過命令行參數(shù)傳遞的配置優(yōu)先級最高。這通常用于在啟動應用程序時臨時修改配置,例如更改端口號或激活特定 Profile。
示例:
java -jar app.jar --server.port=8086
或者通過IDEA設置命令行參數(shù):

此命令將優(yōu)先于所有其他配置來源設置端口號為 8086。

使用場景:
- 部署到生產環(huán)境時臨時覆蓋默認配置。
- 動態(tài)切換 Profile。
3. bootstrap.yml 和 application.yml優(yōu)先級
bootstrap.yml 和 application.yml 都用于配置應用程序的屬性,但它們的作用和優(yōu)先級不同。以下是兩者的詳細對比和優(yōu)先級說明:
3.1. bootstrap.yml 的作用
加載時機:bootstrap.yml 在 application.yml 之前加載。
主要用途:
- 用于應用的引導配置。
- 通常用于設置與 Spring Cloud 相關的配置,例如
spring.cloud.config.*。 - 用于在 配置中心(如 Spring Cloud Config Server)中拉取遠程配置。
- 適合放置一些需要在應用初始化時就生效的屬性,例如:
- 配置文件路徑
- 加密解密密鑰
- 注冊中心配置
示例:
# bootstrap.yml
spring:
application:
name: my-application
cloud:
config:
uri: http://config-server:8888
enabled: true
3.2. application.yml 的作用
- 加載時機:
application.yml在bootstrap.yml加載之后。 - 主要用途:
- 配置應用的主要屬性,如端口號、數(shù)據(jù)源配置、日志配置等。
- 一般是開發(fā)者最常用的配置文件。
- 放置業(yè)務相關的配置。
示例:
# application.yml
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: password
3.3. 優(yōu)先級說明
在屬性加載的優(yōu)先級上:
bootstrap.yml 優(yōu)先于 application.yml。
- 這是因為
bootstrap.yml是 Spring Boot 啟動時的引導配置,加載更早。 - 屬性從
bootstrap.yml中加載后,會合并到 Spring 的環(huán)境中。
如果 application.yml 中的屬性和 bootstrap.yml 沖突:
- 默認情況下,
application.yml中的屬性會覆蓋bootstrap.yml中的屬性(除非bootstrap.yml的屬性被標記為不可覆蓋,如某些 Spring Cloud 配置)。
3.4. 典型使用場景
bootstrap.yml 的場景:
- 使用 Spring Cloud Config 或其他遠程配置服務。
- 初始化階段的配置,例如
spring.application.name、spring.cloud.config.*。 - 多環(huán)境或動態(tài)配置。
application.yml 的場景:
- 應用程序的業(yè)務配置。
- 本地配置和日常開發(fā)使用。
- 配置屬性值可以被命令行參數(shù)、環(huán)境變量等覆蓋。
3.5. 對比
| 特性 | bootstrap.yml | application.yml |
|---|---|---|
| 加載時機 | 更早 | 稍后 |
| 用途 | 引導配置,主要用于配置中心、初始化 | 應用主要配置 |
| 覆蓋優(yōu)先級 | 屬性優(yōu)先級較低,但加載較早 | 屬性優(yōu)先級較高 |
| 推薦使用場景 | Spring Cloud Config、注冊中心配置 | 數(shù)據(jù)源、業(yè)務邏輯相關配置 |
4. 配置優(yōu)先級沖突解析
從上面的示例可以看出,當同一個屬性來自多個來源時,Spring Boot 按優(yōu)先級選擇高的配置。例如:
- 配置文件中
application.yml設置:server: port: 8085
- 同時命令行指定
--server.port=8086。
最終優(yōu)先級選擇結果為 8086,因為命令行參數(shù)優(yōu)先。
5. 最佳實踐
- 使用默認配置: 避免過度依賴多個來源,盡量使用
application.yml。 - 使用 Profile-specific 文件: 區(qū)分開發(fā)、測試、生產環(huán)境。
- 命令行參數(shù)覆蓋配置: 部署時使用命令行參數(shù)靈活調整配置。
- 記錄配置來源: 在文檔中記錄不同配置的來源,便于排查問題。
6. 總結
Spring Boot 3 提供了豐富的配置機制,開發(fā)者可以根據(jù)實際需求選擇合適的方式進行配置管理。了解這些配置來源的優(yōu)先級,有助于在復雜項目中快速定位問題,提升項目的可維護性。
到此這篇關于SpringBoot3各種配置的優(yōu)先級對比小結的文章就介紹到這了,更多相關SpringBoot3 配置優(yōu)先級內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Mybatis自關聯(lián)查詢一對多查詢的實現(xiàn)示例
這篇文章主要介紹了Mybatis自關聯(lián)查詢一對多查詢的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02
springboot自動配置原理以及spring.factories文件的作用詳解
這篇文章主要介紹了springboot自動配置原理以及spring.factories文件的作用詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10

