SpringBoot3各種配置的優(yōu)先級對比小結(jié)
Spring Boot 的核心設(shè)計之一是“約定優(yōu)于配置”(Convention Over Configuration),這使得它能夠根據(jù)默認值和用戶提供的配置快速啟動應(yīng)用程序。然而,在實際開發(fā)中,應(yīng)用的配置可能來自多個來源。理解這些配置來源的優(yōu)先級非常重要,以便在配置沖突時確保程序按預(yù)期運行。
本文將詳細介紹 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)先級)
當(dāng)啟動項目沒有提供某個屬性時,則使用 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 { }
啟動項目,服務(wù)端口為自定義配置的8081。
2.3 配置文件(application.properties 或 application.yml)
application.properties
或 application.yml
是最常用的配置來源。它們可以存在于 src/main/resources
中,也可以作為外部文件。
加載順序:
- 外部文件優(yōu)先于內(nèi)部文件(
src/main/resources
)。 - 文件名以
application
開頭,默認加載application.properties
或application.yml
。 - 位置從高到低優(yōu)先級排序:
當(dāng)前目錄
/config
子目錄JAR 包根目錄
示例:
server: port: 8082
2.4 Profile-specific 配置
Spring Boot 支持根據(jù) Profile 加載特定的配置文件,例如 application-prod.yml
或 application-dev.yml
,這種方式可以幫助開發(fā)者輕松管理和切換開發(fā)、測試、生產(chǎn)等不同環(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
配置文件中設(shè)置:
spring: profiles: active: prod
IDEA配置 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 上設(shè)置環(huán)境變量:
export SERVER_PORT=8084
在 Windows 上設(shè)置環(huán)境變量:
set SERVER_PORT=8084
或 IDEA設(shè)置環(huán)境變量
啟動應(yīng)用后,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 設(shè)置 JVM 參數(shù):
-Dserver.port=8085
此命令會將 server.port
設(shè)置為 8085
:
使用場景:
- 提供全局系統(tǒng)屬性配置。
- 部署時設(shè)置 JVM 級別的變量。
2.7 命令行參數(shù)(最高優(yōu)先級)
通過命令行參數(shù)傳遞的配置優(yōu)先級最高。這通常用于在啟動應(yīng)用程序時臨時修改配置,例如更改端口號或激活特定 Profile。
示例:
java -jar app.jar --server.port=8086
或者通過IDEA設(shè)置命令行參數(shù):
此命令將優(yōu)先于所有其他配置來源設(shè)置端口號為 8086
。
使用場景:
- 部署到生產(chǎn)環(huán)境時臨時覆蓋默認配置。
- 動態(tài)切換 Profile。
3. bootstrap.yml 和 application.yml優(yōu)先級
bootstrap.yml
和 application.yml
都用于配置應(yīng)用程序的屬性,但它們的作用和優(yōu)先級不同。以下是兩者的詳細對比和優(yōu)先級說明:
3.1. bootstrap.yml 的作用
加載時機:bootstrap.yml
在 application.yml
之前加載。
主要用途:
- 用于應(yīng)用的引導(dǎo)配置。
- 通常用于設(shè)置與 Spring Cloud 相關(guān)的配置,例如
spring.cloud.config.*
。 - 用于在 配置中心(如 Spring Cloud Config Server)中拉取遠程配置。
- 適合放置一些需要在應(yīng)用初始化時就生效的屬性,例如:
- 配置文件路徑
- 加密解密密鑰
- 注冊中心配置
示例:
# bootstrap.yml spring: application: name: my-application cloud: config: uri: http://config-server:8888 enabled: true
3.2. application.yml 的作用
- 加載時機:
application.yml
在bootstrap.yml
加載之后。 - 主要用途:
- 配置應(yīng)用的主要屬性,如端口號、數(shù)據(jù)源配置、日志配置等。
- 一般是開發(fā)者最常用的配置文件。
- 放置業(yè)務(wù)相關(guān)的配置。
示例:
# 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 啟動時的引導(dǎo)配置,加載更早。 - 屬性從
bootstrap.yml
中加載后,會合并到 Spring 的環(huán)境中。
如果 application.yml
中的屬性和 bootstrap.yml
沖突:
- 默認情況下,
application.yml
中的屬性會覆蓋bootstrap.yml
中的屬性(除非bootstrap.yml
的屬性被標(biāo)記為不可覆蓋,如某些 Spring Cloud 配置)。
3.4. 典型使用場景
bootstrap.yml
的場景:
- 使用 Spring Cloud Config 或其他遠程配置服務(wù)。
- 初始化階段的配置,例如
spring.application.name
、spring.cloud.config.*
。 - 多環(huán)境或動態(tài)配置。
application.yml
的場景:
- 應(yīng)用程序的業(yè)務(wù)配置。
- 本地配置和日常開發(fā)使用。
- 配置屬性值可以被命令行參數(shù)、環(huán)境變量等覆蓋。
3.5. 對比
特性 | bootstrap.yml | application.yml |
---|---|---|
加載時機 | 更早 | 稍后 |
用途 | 引導(dǎo)配置,主要用于配置中心、初始化 | 應(yīng)用主要配置 |
覆蓋優(yōu)先級 | 屬性優(yōu)先級較低,但加載較早 | 屬性優(yōu)先級較高 |
推薦使用場景 | Spring Cloud Config、注冊中心配置 | 數(shù)據(jù)源、業(yè)務(wù)邏輯相關(guān)配置 |
4. 配置優(yōu)先級沖突解析
從上面的示例可以看出,當(dāng)同一個屬性來自多個來源時,Spring Boot 按優(yōu)先級選擇高的配置。例如:
- 配置文件中
application.yml
設(shè)置:server: port: 8085
- 同時命令行指定
--server.port=8086
。
最終優(yōu)先級選擇結(jié)果為 8086
,因為命令行參數(shù)優(yōu)先。
5. 最佳實踐
- 使用默認配置: 避免過度依賴多個來源,盡量使用
application.yml
。 - 使用 Profile-specific 文件: 區(qū)分開發(fā)、測試、生產(chǎn)環(huán)境。
- 命令行參數(shù)覆蓋配置: 部署時使用命令行參數(shù)靈活調(diào)整配置。
- 記錄配置來源: 在文檔中記錄不同配置的來源,便于排查問題。
6. 總結(jié)
Spring Boot 3 提供了豐富的配置機制,開發(fā)者可以根據(jù)實際需求選擇合適的方式進行配置管理。了解這些配置來源的優(yōu)先級,有助于在復(fù)雜項目中快速定位問題,提升項目的可維護性。
到此這篇關(guān)于SpringBoot3各種配置的優(yōu)先級對比小結(jié)的文章就介紹到這了,更多相關(guān)SpringBoot3 配置優(yōu)先級內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java線性表的存儲結(jié)構(gòu)及其代碼實現(xiàn)
這篇文章主要為大家詳細介紹了Java數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)筆記第一篇,線性表的存儲結(jié)構(gòu)及其代碼實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09java實現(xiàn)簡單學(xué)生管理系統(tǒng)項目
這篇文章主要介紹了java實現(xiàn)簡單學(xué)生管理系統(tǒng)項目,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-07-07Mybatis自關(guān)聯(lián)查詢一對多查詢的實現(xiàn)示例
這篇文章主要介紹了Mybatis自關(guān)聯(lián)查詢一對多查詢的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02springboot自動配置原理以及spring.factories文件的作用詳解
這篇文章主要介紹了springboot自動配置原理以及spring.factories文件的作用詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10