Spring Boot3 Env 項目地址
https://gitee.com/supervol/loong-springboot-study
(記得給個start,感謝)
Env 概述
????????在 Spring Boot 3 開發中,多環境配置是核心能力之一,其目的是為不同場景(如開發、測試、生產)提供隔離的配置(如數據庫連接、端口、日志級別),避免手動修改配置文件的繁瑣與風險。Spring Boot 3 遵循 “約定大于配置” 原則,通過標準化的文件命名、靈活的環境激活方式,實現多環境的無縫切換。
Env 核心
????????Spring Boot 3 通過配置文件命名規則區分不同環境,核心約定如下:
1. 配置文件類型
????????支持兩種主流格式(推薦yaml
,層級結構更清晰,適合多環境):
properties
:鍵值對格式,如application.properties
yaml
(YAML):層級縮進格式,如application.yaml
(推薦)
2. 文件命名規則
所有環境的配置文件需放在項目的src/main/resources
目錄下,命名遵循:
文件類型 | 主配置文件(全局共享) | 環境專屬配置文件(環境隔離) |
---|---|---|
properties | application.properties | application-{profile}.properties |
yaml | application.yaml | application-{profile}.yaml |
其中,{profile}
是環境標識,需自定義且語義化,常見取值:
dev
:開發環境(本地開發用)test
:測試環境(測試人員用)prod
:生產環境(線上部署用)uat
:預發布環境(上線前驗證用)
3. 文件結構示例
src/main/resources/
├─ application.yaml # 主配置(所有環境共享)
├─ application-dev.yaml # 開發環境配置
├─ application-test.yaml # 測試環境配置
└─ application-prod.yaml # 生產環境配置
Env 示例
????????多環境配置的核心是 “主配置共享 + 環境配置覆蓋”—— 主配置定義全局通用屬性(如應用名稱),環境配置定義該環境專屬屬性(如端口、數據庫),同名屬性會被環境配置覆蓋。
1. 代碼位置
????????請參考項目地址中 springboot-env/springboot-env-config 模塊代碼。
2. 激活指定環境
????????Spring Boot 3 支持多種激活方式,優先級從高到低如下(高優先級覆蓋低優先級):
激活方式 | 具體用法 | 適用場景 |
---|---|---|
命令行參數(最高) | 啟動 Jar 時指定:java -jar demo-app.jar --spring.profiles.active=prod | 部署時動態指定環境(推薦) |
JVM 參數 | 啟動時通過-D 指定:java -Dspring.profiles.active=test -jar demo-app.jar | 測試環境調試 |
系統環境變量 | 配置系統變量:SPRING_PROFILES_ACTIVE=prod (Windows/Linux 通用) | 服務器全局環境配置 |
主配置文件(最低) | 在application.yaml 中配置:spring.profiles.active=dev | 本地開發默認環境 |
Env 進階
????????除了基礎的 “一環境一文件”,Spring Boot 3 還支持更靈活的配置組織方式,滿足復雜場景需求。
1. 激活多個環境
????????可同時激活多個環境,實現 “基礎配置 + 功能配置” 的拆分(如日志配置、數據庫配置拆分)。規則:后面激活的環境會覆蓋前面的同名屬性。拆分日志配置:
- 創建通用日志配置文件:
application-log.yaml
logging:pattern:console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
- 激活
dev
和log
環境(命令行方式):bash
java -jar demo-app.jar --spring.profiles.active=dev,log
此時加載順序:application.yaml
?→?application-dev.yaml
?→?application-log.yaml
,log
的配置會覆蓋前兩者的同名日志屬性。
2. Profile 分組
????????當環境依賴多個子配置(如prod
依賴 “數據庫配置 + 緩存配置 + 日志配置”),可通過Profile 分組簡化激活操作。分組生產環境:
????????在主配置application.yaml
中定義分組:
spring:profiles:# 定義prod分組:激活prod時,自動加載prod、prod-db、prod-redisgroup:prod: prod, prod-db, prod-redistest: test, test-db # 測試環境分組
創建子配置文件:
application-prod-db.yaml
(生產數據庫)application-prod-redis.yaml
(生產緩存)
激活分組(只需指定分組名prod
):
java -jar demo-app.jar --spring.profiles.active=prod
3. 外部配置文件
????????生產環境中,配置文件通常不打包進 Jar,而是放在外部目錄(方便修改)。Spring Boot 3 會自動掃描以下外部路徑(優先級從高到低):
- 項目根目錄下的
config/
文件夾 - 項目根目錄
classpath:/config/
(resources/config)classpath:/
(resources,默認)
????????外部配置生產環境,將application-prod.yaml
放在服務器的/opt/app/config/
目錄下,啟動 Jar 時指定外部配置路徑:
java -jar demo-app.jar --spring.profiles.active=prod --spring.config.location=/opt/app/config/
Env 實踐
????????在分布式系統中,本地多環境配置無法滿足 “動態更新配置”“統一管理配置” 的需求,通常會結合配置中心(如 Nacos、Spring Cloud Config)使用:
- 配置中心存儲:將
dev
/test
/prod
環境的配置存儲到配置中心,按環境分組。 - 應用動態拉取:Spring Boot 應用啟動時,通過配置中心的地址和環境標識(如
spring.cloud.nacos.config.profile=prod
),動態拉取對應環境的配置。 - 配置動態更新:配置中心修改配置后,應用無需重啟即可實時感知更新(需開啟配置刷新機制)。
Env 注意
- 配置覆蓋優先級:命令行參數 > 系統環境變量 > JVM 參數 > 外部配置文件 > 內部配置文件。
- 避免硬編碼敏感信息:生產環境的密碼、密鑰等,不要寫在配置文件中,應通過環境變量(如
${DB_PASSWORD}
)或配置中心加密存儲獲取。 - YAML 格式縮進問題:YAML 依賴縮進(2 個空格,不支持 Tab),縮進錯誤會導致配置加載失敗,需注意格式校驗。
- 多環境激活順序:同時激活多個環境時(如
dev,log
),后面的環境會覆蓋前面的同名屬性,需合理安排順序。