一文帶你深入了解SpringBoot配置文件的優(yōu)先級
一、基礎優(yōu)先級順序
1. 文件位置優(yōu)先級(從高到低)
1. 當前目錄的 /config 子目錄
└── ./config/
2. 當前目錄
└── ./
3. classpath 下的 /config 包
└── classpath:/config/
4. classpath 根路徑
└── classpath:/
2. 文件類型優(yōu)先級
在同一目錄下,如果有多個配置文件,優(yōu)先級順序為:
application.properties > application.yml
示例:如果 application.properties 和 application.yml 在同一個目錄,application.properties 中的配置會覆蓋 application.yml 中相同的配置。
二、多環(huán)境配置優(yōu)先級
1. 多環(huán)境文件命名規(guī)則
application-{profile}.properties
application-{profile}.yml2. 完整優(yōu)先級順序(從高到低)
1. 命令行參數
└── java -jar app.jar --server.port=8081
2. 環(huán)境變量(操作系統(tǒng)級)
└── export SERVER_PORT=8081
3. 特定 Profile 的配置文件(按位置優(yōu)先級)
└── application-dev.properties(或 yml)
4. 默認配置文件
└── application.properties(或 yml)
5. Spring Boot 內置默認配置
3. 多環(huán)境配置示例
假設有 dev、prod、test 三個環(huán)境:
# application.properties(默認配置) server.port=8080 app.name=MyApp # application-dev.properties server.port=8081 app.debug=true # application-prod.properties server.port=80 app.debug=false
讀取規(guī)則:
使用 spring.profiles.active=dev 時
- 先讀取
application.properties - 再讀取
application-dev.properties,覆蓋相同屬性 - 最終
server.port=8081
三、重復覆蓋順序詳解
1. 不同位置配置文件的覆蓋
假設存在以下位置的配置文件:
# 位置1: classpath:/application.properties server.port=8080 # 位置2: classpath:/config/application.properties server.port=8081 # 位置3: ./application.properties server.port=8082 # 位置4: ./config/application.properties server.port=8083
最終生效順序:位置4 > 位置3 > 位置2 > 位置1
最終端口:8083
2. 不同格式配置文件的覆蓋
# application.yml
server:
port: 8080
servlet:
context-path: /api
properties
# application.properties
server.port=8081結果:
server.port=8081(properties 覆蓋 yml)server.servlet.context-path=/api(保持不變)
3. 多環(huán)境 + 多位置的復雜覆蓋
# classpath:/application.properties server.port=8080 # classpath:/application-dev.properties server.port=8081 # classpath:/config/application.properties server.port=8082 # classpath:/config/application-dev.properties server.port=8083
使用 --spring.profiles.active=dev 時:
加載順序:
- classpath:/application.properties (8080)
- classpath:/config/application.properties (8082) - 覆蓋
- classpath:/application-dev.properties (8081) - 覆蓋
- classpath:/config/application-dev.properties (8083) - 覆蓋
最終端口:8083
四、配置加載順序完整清單
Spring Boot 配置加載順序(從高到低):
1. 命令行參數
2. Java 系統(tǒng)屬性 (System.getProperties())
3. 操作系統(tǒng)環(huán)境變量
4. JNDI 屬性 (java:comp/env)
5. RandomValuePropertySource (random.* 屬性)
6. 特定 Profile 的配置文件(jar 包外)
7. 特定 Profile 的配置文件(jar 包內)
8. 默認配置文件(jar 包外)
9. 默認配置文件(jar 包內)
10. @PropertySource 注解配置
11. SpringApplication 默認屬性
五、實際應用建議
1. 配置文件組織示例
項目結構:
├── src/main/resources/
│ ├── application.yml # 通用配置
│ ├── application-dev.yml # 開發(fā)環(huán)境
│ ├── application-test.yml # 測試環(huán)境
│ └── application-prod.yml # 生產環(huán)境
└── config/ # 外部配置目錄(生產環(huán)境)
└── application-prod.yml # 覆蓋內部配置
2. 優(yōu)先級最佳實踐
# 1. 使用 application.yml 存放默認配置
spring:
profiles:
active: dev
application:
name: my-service
# 2. 環(huán)境特定配置放在 application-{profile}.yml
# application-dev.yml
server:
port: 8080
servlet:
context-path: /dev
# 3. 敏感信息通過環(huán)境變量或命令行覆蓋
# java -jar app.jar --db.password=${DB_PASSWORD}3. 驗證配置優(yōu)先級的代碼示例
@Component
public class ConfigPrinter implements ApplicationRunner {
@Value("${server.port}")
private String port;
@Value("${app.name:default}")
private String appName;
@Autowired
private Environment environment;
@Override
public void run(ApplicationArguments args) {
System.out.println("Server Port: " + port);
System.out.println("App Name: " + appName);
// 查看所有激活的配置文件
Arrays.stream(environment.getActiveProfiles())
.forEach(profile -> System.out.println("Active Profile: " + profile));
}
}六、特殊情況處理
1. 使用 spring.config.location 強制指定
java -jar app.jar --spring.config.location=/opt/config/application.yml
此時只加載指定位置的配置文件,其他位置不加載。
2. 使用 spring.config.additional-location 補充
java -jar app.jar --spring.config.additional-location=/opt/config/
額外添加配置位置,仍然會加載默認位置的配置。
3. 配置文件的合并規(guī)則
- 簡單類型:后面的覆蓋前面的
- 集合/Map類型:完全覆蓋,不是合并
- 對象類型:屬性級別的覆蓋
示例:
# application.yml
app:
config:
key1: value1
key2: value2
# application-dev.yml
app:
config:
key1: new-value1結果:只有 key1 被覆蓋,key2 仍然保留。
理解這些優(yōu)先級規(guī)則對于管理復雜的 Spring Boot 應用配置非常重要,可以避免配置沖突和意外的行為。
到此這篇關于一文帶你深入了解SpringBoot配置文件的優(yōu)先級的文章就介紹到這了,更多相關SpringBoot配置文件優(yōu)先級內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
基于Java + OpenClaw搭建本地大模型私有化的方案
數據不出內網、模型本地跑、代碼自己控——本文這套方案教你用Java+OpenClaw搭建企業(yè)級私有AI中樞,告別數據裸奔,讓核心資料安心喂給AI,需要的朋友可以參考下2026-03-03
利用Java工具類Hutool實現(xiàn)驗證碼校驗功能
這篇文章主要介紹了利用Java工具類Hutool實現(xiàn)驗證碼校驗功能,利用Hutool實現(xiàn)驗證碼校驗,校驗的Servlet與今天的第一篇是一樣的,唯一就是驗證碼的生成是不一樣的,利用Hutool生成驗證碼更快捷.需要的朋友可以參考下2022-10-10
關于ConditionalOnMissingBean失效問題的追蹤
這篇文章主要介紹了關于ConditionalOnMissingBean失效問題的追蹤方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
spring-boot-maven-plugin插件打包和java -jar命令執(zhí)行原理分析
這篇文章主要介紹了spring-boot-maven-plugin插件打包和java -jar命令執(zhí)行原理,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-05-05
java并發(fā)使用CountDownLatch在生產環(huán)境翻車剖析
這篇文章主要為大家介紹了java并發(fā)使用CountDownLatch在生產環(huán)境翻車的示例剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08
關于break和continue以及l(fā)abel的區(qū)別和作用(詳解)
下面小編就為大家?guī)硪黄P于break和continue以及l(fā)abel的區(qū)別和作用(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05

