SpringBoot 使用 spring.profiles.active 來區分不同環境配置

很多時候,我們項目在開發環境和生產環境的配置是不一樣的,例如,數據庫配置,在開發的時候,我們一般用測試數據庫,而在生產環境,我們要用生產數據庫,這時候,我們可以利用 profile 在不同的環境下配置用不同的配置文件或者不同的配置。

Spring Boot 允許你通過命名約定按照一定的格式 (application-{profile}.properties) 來定義多個配置文件,然后通過在 application.properties 通過 spring.profiles.active 來具體激活一個或者多個配置文件,如果沒有指定任何 profile 的配置文件,Spring Boot 默認會啟動 application-default.properties。

一、具體配置實現方法參考如下
  1. 在 application.properties 文件的同路徑下,創建不同的環境參數文件,命名格式為:application-{profile}.properties,其中 {profile} 對應環境標識。
    在這里插入圖片描述

如上圖所示,項目共配置了三個不同的環境,分別為:

  • application-dev.properties:開發環境
  • application-test.properties:測試環境
  • application-prod.properties:生產環境

至于哪個具體的配置文件會被加載,需要在 application.properties 文件中通過 spring.profiles.active 屬性來設置,其值對應 {profile} 值。

  1. 修改 application.properties 文件內容,指定生效的環境,內容如下。

    spring.profiles.active=dev

spring.profiles.active 取值可為 dev、prod、test。上述配置指定開發環境配置文件有效,即取 application-dev.properties 文件中的相關配置。

  1. 啟動時指定生效的 profiles 參數,啟動腳本示例如下所示。

    nohup java -Xms3g -Xmx3g -Xmn1g -Xss256k -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/logdisk/gclog/gctest.log -jar test-1.0-SNAPSHOT.jar --spring.profiles.active=prod >/dev/null 2>&1 &

二、配置文件(application.properties)所在目錄不同,加載優先級也不同

在 Spring Boot 源碼文件(spring-boot-2.1.3.RELEASE.jar)中,org.springframework.boot.context.config 包下的 ConfigFileApplicationListener 類中定義了默認配置文件和默認搜索路徑,也可以通過該類中的 setSearchLocations() 和 setSearchNames() 方法來設置其他的搜索位置或者設置其它配置文件名稱。

ConfigFileApplicationListener 是一個 ApplicationListener,也是一個 EnvironmentPostProcessor。作為 ApplicationListener,它監聽了事件 ApplicationEnvironmentPreparedEvent 和 ApplicationPreparedEvent。ApplicationEnvironmentPreparedEvent 事件發生時,它將 Spring Boot 內置配置的其他 EnvironmentPostProcessor 和自己放到一起,排序,然后應用到應用上下文環境對象上。該 EnvironmentPostProcessor 對應用上下文環境所做的操作就是讀取配置文件將它們添加到應用上下文環境中去。ConfigFileApplicationListener 類所在的包路徑如下圖所示。
在這里插入圖片描述
ConfigFileApplicationListener 類部分源碼如下所示。

// Note the order is from least to most specific (last one wins)private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/";

缺省情況下,配置屬性會從以下路徑的 application.properties/yml 文件中讀取:

  • classpath:/
  • classpath:/config/
  • file:./
  • file:./config/

如注釋所言,上述配置文件優先級由低到高,重復的配置被高優先級覆蓋,不重復的配置互補。如下圖所示,application.properties 優先級從 1 到 4 遞減。
在這里插入圖片描述

三、外部配置

Spring Boot 也可以采用外部配置文件來配置不同環境的屬性,具體可以參考官方文檔:https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-external-config。截取部分文檔內容如下,完整文檔可以閱讀官網。
在這里插入圖片描述

文章參考:

  • 7.springboot配置文件配置運行環境、放置位置
  • https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-external-config
  • Springboot內置ApplicationListener–ConfigFileApplicationListener

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

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

相關文章

怎么進行mysql的優化?

MySQL 的優化是一個系統性的工作,涉及多個層面,包括查詢優化、索引優化、配置優化、架構優化等。以下是一些常見的 MySQL 優化方法: 查詢優化 避免全表掃描:確保查詢能夠使用索引,避免 SELECT *,只選擇需要…

談談 Node.js 中的模塊系統,CommonJS 和 ES Modules 的區別是什么?

Node.js 模塊系統:CommonJS 和 ES Modules 核心差異與實戰指南 一、模塊系統基礎概念 **CommonJS (CJS)**? 是 Node.js 傳統模塊系統,采用同步加載方式,典型特征: // 導出 module.exports { name: cjs }; // 或 exports.nam…

【HarmonyOS Next】 鴻蒙應用useNormalizedOHMUrl詳解

【HarmonyOS Next】 鴻蒙應用useNormalizedOHMUrl詳解 一、useNormalizedOHMUrl是什么? useNormalizedOHMUrl指的是是否使用標準化OHMUrl拼接。 在開發過程中,需要根據不同的環境或配置動態生成 URL。例如,在加載一些遠程模塊或者資源時,…

wav格式的音頻壓縮,WAV 轉 MP3 VBR 體積縮減比為 13.5%、多個 MP3 格式音頻合并為一個、文件夾存在則刪除重建,不存在則直接建立

🥇 版權: 本文由【墨理學AI】原創首發、各位讀者大大、敬請查閱、感謝三連 🎉 聲明: 作為全網 AI 領域 干貨最多的博主之一,?? 不負光陰不負卿 ?? 文章目錄 問題一:wav格式的音頻壓縮為哪些格式,網絡傳輸給用戶播放…

MFC線程

創建線程 HANDLE m_hThread; m_hThread CreateThread(NULL, 0, save_snapshot, (LPVOID)this, 0, &iThreadId);開啟線程循環等待 DWORD WINAPI save_snapshot(LPVOID pVoid) {while (true){//持續循環等待事件到達。接收到事件信號后才進入if。if (::WaitForSingleObjec…

賦能農業數字化轉型 雛森科技助力“聚農拼”平臺建設

賦能農業數字化轉型,雛森科技助力“聚農拼”平臺建設 在數字化浪潮席卷各行業的今天,農業領域也在積極探索轉型升級之路。中農集團一直以“根植大地,服務三農”為核心,以“鄉村振興,農民增收”為目標,及時…

千峰React:Hooks(上)

什么是Hooks ref引用值 普通變量的改變一般是不好觸發函數組件的渲染的,如果想讓一般的數據也可以得到狀態的保存,可以使用ref import { useState ,useRef} from reactfunction App() {const [count, setCount] useState(0)let num useRef(0)const h…

Ubuntu20.04安裝Redis

1.切換到root用戶 如果沒有切換到root用戶的,切換到root用戶。 2.使用 apt install redis 安裝redis 遇到y/n直接y即可。 redis安裝好之后就自動啟動起來了,因此我們可以通過netstat -anp | grep redis命令來查看是否安裝成功。 6379是Redis的默認端…

鴻蒙-AVPlayer

compileVersion 5.0.2(14) 音頻播放 import media from ohos.multimedia.media; import common from ohos.app.ability.common; import { BusinessError } from ohos.base;Entry Component struct AudioPlayer {private avPlayer: media.AVPlayer | nu…

機器學習數學通關指南——泰勒公式

前言 本文隸屬于專欄《機器學習數學通關指南》,該專欄為筆者原創,引用請注明來源,不足和錯誤之處請在評論區幫忙指出,謝謝! 本專欄目錄結構和參考文獻請見《機器學習數學通關指南》 正文 一句話總結 泰勒公式是用多…

游戲引擎學習第124天

倉庫:https://gitee.com/mrxiao_com/2d_game_3 回顧/復習 今天是繼續完善和調試多線程的任務隊列。之前的幾天,我們已經介紹了多線程的一些基礎知識,包括如何創建工作隊列以及如何在線程中處理任務。今天,重點是解決那些我們之前沒有注意到…

在MacOS上打造本地部署的大模型知識庫(一)

一、在MacOS上安裝Ollama docker run -d -p 3000:8080 --add-hosthost.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main 最后停掉Docker的ollama,就能在webui中加載llama模…

(八)Java-Collection

一、Collection接口 1.特點 Collection實現子類可以存放多個元素,每個元素可以是Object; 有些Collection的實現類,可以存放重復的元素,有些不可以; 有些Collection的實現類,有些是有序的(Li…

大模型RAG(檢索增強)創新--SELF-RAG

檢索增強生成 (RAG) 提供了一種將 ChatGPT/GPT-4 等大型語言模型與自定義數據集成的途徑,但存在局限性。讓我們看看 RAG 最近的研究是如何解決一些問題。 大語言模型(LLM)將改變整個金融領域。其中一個場景是大語言模型可以學習大量文檔,并在很短的時間內…

《AI和人工智能和編程日報》

OpenAI:將深度研究擴展到 ChatGPT Plus、Team、Edu 和 Enterprise 用戶,每月 10 次查詢;Pro 用戶每月有 120 次查詢,ChatGPT 語音模式向免費用戶開放。DeepSeek:R1 大模型宣布降價,調用價格將至四分之一&am…

【音視頻】編解碼相關概念總結

NALU RTP PS流 三者總體關系 NALU在RTP中的應用:視頻流的RTP傳輸通常將NALU作為基本的單元進行傳輸。每個RTP包攜帶一個或多個NALU,這些NALU包含了視頻編碼數據。RTP協議通過其頭部信息(如時間戳、序列號等)幫助接收端重新排列和…

端口映射/內網穿透方式及問題解決:warning: remote port forwarding failed for listen port

文章目錄 需求:A機器是內網機器,B機器是公網服務器,想要從公網,訪問A機器的端口方式:端口映射,內網穿透,使用ssh打洞端口:遇到問題:命令執行成功,但是端口轉發…

11特殊函數

一、遞歸函數 遞歸概念:如果一個函數內部,包含了對自身的調用,則該函數稱為遞歸函數。要點: 只有能被表達為遞歸的問題,才能用遞歸函數解決。遞歸函數必須有一個可直接退出的條件,否則會進入無限遞歸。遞歸…

如何使用useContext進行全局狀態管理?

在 React 中,使用 useContext 進行全局狀態管理是一種有效的方法,尤其在需要在多個組件之間共享狀態時。useContext 允許你在組件樹中傳遞數據,而無需通過每個組件的 props 逐層傳遞。以下是關于如何使用 useContext 進行全局狀態管理的詳細指…

鴻蒙 ArkUI 實現敲木魚小游戲

敲木魚是一款具有禪意的趣味小游戲,本文將通過鴻蒙 ArkUI 框架的實現代碼,逐步解析其核心技術點,包括動畫驅動、狀態管理、音效震動反饋等。 一、架構設計與工程搭建 1.1 項目結構解析 完整項目包含以下核心模塊: ├── entry…