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