SpringBoot08-Spring Boot 多環境配置

方式一:純 Spring Profile(最常用,官方推薦)

思路:用 application-{profile}.yml 切分配置,運行時指定用哪個 profile。
如何做

src/main/resources/application.ymlapplication-dev.ymlapplication-test.ymlapplication-prod.yml

application.yml 里可以只放公共配置;每個環境放到對應文件。

如何激活(四選一即可):

  • 命令行:java -jar app.jar --spring.profiles.active=dev

  • JVM 參數:-Dspring.profiles.active=dev

  • 環境變量:SPRING_PROFILES_ACTIVE=dev

  • application.yml

    spring:profiles:active: dev
    

何時用:絕大多數項目;無需改打包流程,開發/測試/生產切換最靈活。


方式二:同一個 yml 用分段 + on-profile(Boot 2.4+)

思路:一個文件里--- 分段,并用 spring.config.activate.on-profile 指定生效條件。
如何做

# application.yml (一個文件)
server:port: 8080   # 公共---
spring:config:activate:on-profile: dev
datasource:url: jdbc:...---
spring:config:activate:on-profile: prod
datasource:url: jdbc:...

每個塊里可以加一個條件:

spring:config:activate:on-profile: dev

一、單文件 + --- + spring.config.activate.on-profile 的規則

1. 公共段(最上面沒有 on-profile 的部分)

  • 始終加載,不管你激活哪個 profile

  • 可以放端口號、應用名這種通用配置

2. 環境段(有 on-profile 的部分)

  • 只有當你激活對應 profile 時才加載

  • 激活方式就是 spring.profiles.active


二、激活 profile 的途徑(不僅僅是運行時)

  • 運行時命令行

    java -jar app.jar --spring.profiles.active=dev
    
  • JVM 參數

    java -jar -Dspring.profiles.active=dev app.jar
    
  • 環境變量

    SPRING_PROFILES_ACTIVE=dev
    
  • application.yml 的公共部分寫死

    spring:profiles:active: dev
    

何時用:不想維護多個文件時;仍是“純 Spring”的方式。


方式三:Maven/Gradle 構建期切換(資源過濾 + 占位符)


1. 核心思想

Spring Boot 原生的 Profile 切換(方式一、二)是運行時選擇環境。
而方式三是讓 構建工具(Maven/Gradle)在打包的時候就決定環境,即:

👉 打包出來的 jar 已經帶著某個環境的配置,運行時不用再指定。


2. 原理

  1. Maven/Gradle 的 profiles 可以給不同環境定義屬性。

  2. 資源過濾(resource filtering) 會在打包時,把配置文件里的占位符替換為 Maven/Gradle 的屬性值。

  3. Spring Boot 啟動時讀取配置文件,就已經是對應環境的內容了。


3. 步驟(以 Maven 為例)

1. 定義多環境 Profile

pom.xml 里寫不同的 profile:

<profiles><!-- 開發環境 --><profile><id>dev_env</id><properties><profile.active>dev</profile.active></properties></profile><!-- 測試環境 --><profile><id>test_env</id><properties><profile.active>test</profile.active></properties></profile><!-- 生產環境 --><profile><id>prod_env</id><properties><profile.active>prod</profile.active></properties></profile>
</profiles>

2. 開啟資源過濾

pom.xml<build> 里:

<build><resources><resource><directory>src/main/resources</directory><filtering>true</filtering></resource></resources>
</build>

3. 在 Spring 配置里用占位符

application.yml

spring:profiles:active: @profile.active@

這里的 @profile.active@ 會在打包時被 Maven 替換成對應 profile 的值(比如 dev)。

4. 打包時選擇環境

mvn clean package -Pdev_env   # 打包時替換成 dev
mvn clean package -Ptest_env  # 打包時替換成 test
mvn clean package -Pprod_env  # 打包時替換成 prod

生成的 jar 里 application.yml 已經被替換成:

spring:profiles:active: dev

(或者 test/prod,取決于你打包時選了哪個)


4. 運行時

直接運行 jar 就行,不用再傳 --spring.profiles.active

java -jar target/demo-1.0.0.jar

因為它在打包時已經確定了環境。


5. 適用場景

  • CI/CD 構建流水線里,每個環境需要一份獨立的 jar(比如 demo-dev.jardemo-prod.jar)。

  • 公司要求運維簡單:生產只拿固定的包運行,不允許再傳啟動參數。


6. 總結一句

方式三其實是“打包時定死環境,用 Maven profile 替換 yml 的占位符”。

<activation> 是否必須?不是!

  • 不寫 <activation>:你需要用 -Pxxx 手動選擇哪個 Maven profile。

  • 寫了 <activeByDefault>true</activeByDefault>:在沒傳 -P 時默認用這個。

方式四:外部化配置文件(不改包,部署時掛載)

思路:jar 外面放環境配置,通過路徑或目錄注入。
怎么做

  • 指定額外位置:
    java -jar app.jar --spring.config.additional-location=/etc/app/
    在該目錄放 application-prod.yml,配合 SPRING_PROFILES_ACTIVE=prod 使用。

  • 或直接指定完整路徑:
    --spring.config.location=/etc/app/application.yml

何時用:Docker/K8s/云上部署;把“敏感/環境差異”留到部署層處理。


方式五:代碼層面的 Bean 隔離(@Profile)

思路:按環境注冊不同的 Bean。
怎么做

@Profile("prod")
@Configuration
public class ProdConfig { ... }@Profile("dev")
@Configuration
public class DevConfig { ... }

何時用:某些組件在不同環境需要完全不同的實現(如 Mock vs 實際服務)。


#(可選)增強:Profile 組 & 包含

  • Profile 組(Boot 2.4+):一個 profile 激活一組子 profile。

    spring:profiles:group:prod: [db, redis, messaging]
    
  • include(老版本)
    spring.profiles.include=db,redis

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95361.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95361.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95361.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

蒼穹外賣項目筆記day04--Redis入門

Redis 概念 Redis 是一個開源的、高性能的鍵值存儲系統&#xff0c;常被歸類為NoSQL數據庫。它支持多種數據結構&#xff0c;如字符串、列表、哈希、集合和有序集合&#xff0c;適用于緩存、消息隊列、實時分析等多種場景。Redis是一個基于內存的key-value結構數據庫。Redis …

OpenCV 圖像處理實戰與命令行參數配置:從輪廓檢測到模板匹配

在計算機視覺領域&#xff0c;OpenCV 是一款功能強大且應用廣泛的開源庫&#xff0c;它提供了豐富的 API&#xff0c;支持圖像讀取、預處理、特征檢測等多種操作。本文將結合實際代碼案例&#xff0c;詳細講解如何使用 OpenCV 實現輪廓檢測、輪廓近似、模板匹配等常用功能&…

深度學習---pytorch卷積神經網絡保存和使用最優模型

在深度學習模型訓練過程中&#xff0c;如何提升模型性能、精準保存最優模型并實現高效推理&#xff0c;是每個開發者必須攻克的關鍵環節。本文結合實際項目經驗與完整代碼示例&#xff0c;詳細拆解模型訓練優化、最優模型保存與加載、圖像預測全流程&#xff0c;幫助大家避開常…

FPGA實現Aurora 64B66B圖像視頻點對點傳輸,基于GTY高速收發器,提供2套工程源碼和技術支持

目錄 1、前言Aurora 64B66B是啥&#xff1f;官方有Example&#xff0c;為何要用你這個&#xff1f;工程概述免責聲明 2、相關方案推薦我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目我這里已有的 GT 高速接口解決方案本方案在Aurora 8B10B上的應用 3、工程詳細設…

LeetCode 524.通過刪除字母匹配到字典里最長單詞

給你一個字符串 s 和一個字符串數組 dictionary &#xff0c;找出并返回 dictionary 中最長的字符串&#xff0c;該字符串可以通過刪除 s 中的某些字符得到。 如果答案不止一個&#xff0c;返回長度最長且字母序最小的字符串。如果答案不存在&#xff0c;則返回空字符串。 示例…

kali_linux

【2024版】最新kali linux入門及常用簡單工具介紹&#xff08;非常詳細&#xff09;從零基礎入門到精通&#xff0c;看完這一篇就夠了-CSDN博客

MyBatis 常見錯誤與解決方案:從坑中爬出的實戰指南

&#x1f50d; MyBatis 常見錯誤與解決方案&#xff1a;從坑中爬出的實戰指南 文章目錄&#x1f50d; MyBatis 常見錯誤與解決方案&#xff1a;從坑中爬出的實戰指南&#x1f41b; 一、N1 查詢問題與性能優化&#x1f4a1; 什么是 N1 查詢問題&#xff1f;?? 錯誤示例? 解決…

藍牙modem端frequency offset compensation算法描述

藍牙Modem中一個非常關鍵的算法:頻偏估計與補償(Frequency Offset Estimation and Compensation)。這個算法是接收機(解調端)能正確工作的基石。 我將為您詳細解釋這個算法的原理、必要性以及其工作流程。 一、核心問題:為什么需要頻偏補償? 頻偏的來源: 如第一張圖所…

基于STM32的居家養老健康安全檢測系統

若該文為原創文章&#xff0c;轉載請注明原文出處。一、 項目背景與立項意義社會老齡化趨勢加劇&#xff1a;全球范圍內&#xff0c;人口結構正經歷著前所未有的老齡化轉變。中國也不例外&#xff0c;正快速步入深度老齡化社會。隨之而來的是龐大的獨居、空巢老年人群體的健康監…

簡易TCP網絡程序

目錄 1. TCP 和 UDP 的基本區別 2. TCP 中的 listen、accept 和 connect 3. UDP 中的區別&#xff1a;沒有 listen、accept 和 connect 4. 總結對比&#xff1a; 2.字符串回響 2.1.核心功能 2.2 代碼展示 1. server.hpp 服務器頭文件 2. server.cpp 服務器源文件 3. …

廣電手機卡到底好不好?

中國廣電于2020年與中國移動簽署了戰略合作協議&#xff0c;雙方在5G基站建設方面實現了共建共享。直到2022年下半年&#xff0c;中國廣電才正式進入號卡服務領域&#xff0c;成為新晉運營商。雖然在三年的時間內其發展速度較快&#xff0c;但對于消費者而言&#xff0c;廣電的…

Git中批量恢復文件到之前提交狀態

<摘要> Git中批量恢復文件到之前提交狀態的核心命令是git checkout、git reset和git restore。根據文件是否已暫存&#xff08;git add&#xff09;&#xff0c;需采用不同方案&#xff1a;未暫存變更用git checkout -- <file>或git restore <file>丟棄修改&…

UniApp 基礎開發第一步:HBuilderX 安裝與環境配置

UniApp 是一個基于 Vue.js 的跨平臺開發框架&#xff0c;支持快速構建小程序、H5、App 等應用。作為開發的第一步&#xff0c;正確安裝和配置 HBuilderX&#xff08;官方推薦的 IDE&#xff09;是至關重要的。下面我將以清晰步驟引導您完成整個過程&#xff0c;確保環境可用。整…

華為云Stack Deploy安裝(VMware workstation物理部署)

1.1 華為云Stack Deploy安裝(VMware workstation物理部署) 步驟 1 安裝軟件及環境準備 HUAWEI_CLOUD_Stack_Deploy_8.1.1-X86_64.iso HCSD安裝鏡像 VMware workstation軟件 VirtualBox安裝包 步驟2 修改VMware workstation網絡模式 打開VMware workstation軟件,點“編輯”…

安全等保復習筆記

信息安全概述1.2 信息安全的脆弱性及常見安全攻擊 ? 網絡環境的開放性物理層--物理攻擊 ? 物理設備破壞 ? 指攻擊者直接破壞網絡的各種物理設施&#xff0c;比如服務器設施&#xff0c;或者網絡的傳輸通信設施等 ? 設備破壞攻擊的目的主要是為了中斷網絡服務 ? 物理設備竊…

【Audio】切換至靜音或振動模式時媒體音自動置 0

一、問題描述 基于 Android 14平臺&#xff0c;AudioService 中當用戶切換到靜音模式&#xff08;RINGER_MODE_SILENT&#xff09;或振動模式&#xff08;RINGER_MODE_VIBRATE&#xff09;時會自動將響鈴和通知音量置0&#xff0c;當切換成響鈴模式&#xff08;RINGER_MODE_NO…

VPS云服務器安全加固指南:從入門到精通的全面防護策略

在數字化時代&#xff0c; VPS云服務器已成為企業及個人用戶的重要基礎設施。隨著網絡攻擊手段的不斷升級&#xff0c;如何有效進行VPS安全加固成為每個管理員必須掌握的技能。本文將系統性地介紹從基礎配置到高級防護的完整安全方案&#xff0c;幫助您構建銅墻鐵壁般的云服務器…

Mysql雜志(八)

游標游標是MySQL中一種重要的數據庫操作機制&#xff0c;它解決了SQL集合操作與逐行處理之間的矛盾。這個相信大家基本上都怎么使用過&#xff0c;這個都是建立在使用存儲過程的基礎上的。我們都知道SQL都是批量處理的也就是面向集合操作&#xff08;一次操作多行&#xff09;&…

Dify 從入門到精通(第 71/100 篇):Dify 的實時流式處理(高級篇)

Dify 從入門到精通&#xff08;第 71/100 篇&#xff09;&#xff1a;Dify 的實時流式處理 Dify 入門到精通系列文章目錄 第一篇《Dify 究竟是什么&#xff1f;真能開啟低代碼 AI 應用開發的未來&#xff1f;》介紹了 Dify 的定位與優勢第二篇《Dify 的核心組件&#xff1a;從…

日志分析與安全數據上傳腳本

最近在學習計算機網絡&#xff0c;想著跟python結合做一些事情。這段代碼是一個自動化腳本&#xff0c;它主要有三個功能&#xff1a;分析日志&#xff1a; 它從你指定的日志文件中讀取內容&#xff0c;并篩選出所有包含特定關鍵字的行。網絡交互&#xff1a; 它將篩選出的數據…