Spring Boot 配置源詳解(完整版)


Spring Boot 配置源詳解(完整版)

在這里插入圖片描述


一、配置源加載順序與優先級
配置源類型優先級順序(從高到低)對應配置類/接口是否可覆蓋典型文件/來源
命令行參數--key=value1(最高)SimpleCommandLinePropertySourceorg.springframework.core.env啟動參數(如 java -jar app.jar --server.port=9090
SPRING_APPLICATION_JSON2MapPropertySourceorg.springframework.core.env環境變量或系統屬性(如 -Dspring.application.json={...}
系統環境變量3SystemEnvironmentPropertySourceorg.springframework.core.env操作系統環境變量(如 export APP_NAME=myapp
@PropertySource 注解4PropertySourcesPropertyResolverorg.springframework.core.env代碼中指定的資源路徑(如 classpath:custom.properties
ServletConfig 初始化參數5ServletConfigPropertySourceorg.springframework.boot.envWeb 容器配置(如 Tomcat 的 context-param
ServletContext 初始化參數6ServletContextPropertySourceorg.springframework.boot.envWeb 容器配置(如 Tomcat 的 init-param
JNDI 環境變量7JndiPropertySourceorg.springframework.core.envJNDI 服務器配置(如 java:comp/env
隨機屬性random.*8RandomValuePropertySourceorg.springframework.boot.env自動生成隨機值(如 random.number=12345
類路徑 application.properties/.yml9YamlPropertySourceLoader, PropertiesPropertySourceLoaderorg.springframework.boot.envsrc/main/resources/application.properties
資源目錄 application.properties10ResourcePropertySourceorg.springframework.core.env外部目錄(如 /config/application.properties
Profile 特定配置(如 application-dev.properties11ProfileSpecificPropertySourceorg.springframework.boot.envsrc/main/resources/application-{profile}.properties
外置配置文件(如 external-config/application.properties12ExternalConfigPropertySourceorg.springframework.boot.env外置路徑(如 /opt/config/application.properties

二、配置源加載流程詳解
  1. 初始化 Environment

    • Spring Boot 啟動時,通過 SpringApplication 創建 Environment 對象(類型 StandardEnvironment)。
    • Environment 管理所有配置源的集合 PropertySources
  2. 加載引導配置

    • 通過 PropertySourceBootstrapConfiguration 加載 bootstrap.yml/properties(用于配置加密、外部配置文件路徑等)。
  3. 逐層加載配置源

    • 使用 PropertySourceLoader 加載不同格式的配置文件(如 YAML、Properties):
      // 例如加載 YAML 文件
      YamlPropertySourceLoader loader = new YamlPropertySourceLoader();
      Resource resource = new ClassPathResource("application.yml");
      PropertySource<?> yamlSource = loader.load("application", resource, 0);
      environment.getPropertySources().addLast(yamlSource);
      
  4. 合并配置源

    • 按優先級順序合并所有 PropertySource,高優先級覆蓋低優先級的同名屬性。

三、配置轉換過程
  1. 屬性解析

    • 通過 ConfigurationPropertySources 將所有 PropertySource 轉換為 ConfigurationPropertySource
      // 示例:解析屬性路徑
      ConfigurationPropertyName name = ConfigurationPropertyName.of("server.port");
      
  2. 綁定到 Bean

    • 使用 Binder 將屬性值綁定到 @ConfigurationProperties 注解的 Bean:
      @ConfigurationProperties(prefix = "app")
      public class AppProperties {private String name;private int timeout;// getters/setters
      }@SpringBootApplication
      @EnableConfigurationProperties(AppProperties.class) // 必須啟用
      public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
      }
      
  3. 類型轉換

    • 通過 ConversionService 處理類型轉換(如 StringInteger):
      @Bean
      public ConversionService conversionService() {GenericConversionService service = new GenericConversionService();service.addConverter(String.class, Integer.class, s -> Integer.parseInt(s));return service;
      }
      

四、嵌套與替換規則
  1. 變量替換

    • 支持 ${key} 語法引用其他屬性:
      # application.properties
      base.url=http://example.com
      api.url=${base.url}/api
      
  2. 優先級覆蓋

    • 高優先級配置源的值覆蓋低優先級的同名屬性:
      # application.properties: server.port=8080
      # 命令行參數:--server.port=9090 → 最終值為 9090
      
  3. 多文檔合并

    • 同名屬性按加載順序依次覆蓋,最終保留最高優先級的值。

五、配置源對比表
配置源類型位置/來源是否可覆蓋典型使用場景代碼示例
命令行參數啟動參數運行時動態配置java -jar app.jar --server.port=9090
SPRING_APPLICATION_JSON環境變量或系統屬性簡單 JSON 配置-Dspring.application.json='{ "server": { "port": 9090 } }'
系統環境變量操作系統環境變量生產環境全局配置export SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306/db
@PropertySource 注解代碼指定的資源路徑內嵌特定配置文件```java
\n@Configuration\n@PropertySource(“classpath:custom.properties”)\n```
外置配置文件文件系統(如 /config生產環境外部配置/config/application.properties
Profile 特定配置類路徑或外置路徑不同環境差異化配置application-dev.properties

六、代碼示例
1. 系統環境變量覆蓋
# 操作系統環境變量設置:
export APP_NAME="ProductionApp"
// 使用 @Value 注入
@Value("${APP_NAME}")
private String appName;
2. 隨機屬性使用
# application.properties
random.seed=12345
@Value("${random.number}")
private int randomNum; // 自動生成隨機數
3. JNDI 配置示例
// JNDI 配置(需容器支持)
@Resource(name = "java:comp/env/jdbc/datasource")
private DataSource dataSource;
4. 外置配置文件激活
# 啟動命令指定配置路徑:
java -jar app.jar --spring.config.location=file:/opt/config/application.properties
5. Profile 特定配置
# application-dev.properties
spring.datasource.url=jdbc:mysql://localhost:3306/dev
// 啟動時指定 Profile:
java -jar app.jar --spring.profiles.active=dev

七、總結表格
配置源類型優先級對應類/接口是否可覆蓋典型文件/來源示例
命令行參數SimpleCommandLinePropertySource啟動參數--server.port=9090
系統環境變量SystemEnvironmentPropertySource操作系統環境變量export SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306/db
類路徑 application.propertiesPropertiesPropertySourceLoader內置資源路徑src/main/resources/application.properties
外置配置文件中低ExternalConfigPropertySource外部文件路徑/config/application.properties

關鍵代碼類參考

  • 加載器YamlPropertySourceLoader, PropertiesPropertySourceLoaderorg.springframework.boot.env
  • 環境管理StandardEnvironment, ConfigurableEnvironmentorg.springframework.core.env
  • 綁定機制Binder, ConfigurationPropertyBindingPostProcessororg.springframework.boot.context.properties

通過上述流程,Spring Boot 實現了靈活且可擴展的配置管理能力,開發者可根據需求選擇合適的配置源并控制優先級。

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

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

相關文章

【無人機】無人機遙控器設置與校準,飛行模式的選擇,無線電控制 (RC) 設置

目錄 1、遙控器校準 1.1、校準步驟 2、飛行模式選擇&#xff0c;遙控器通道映射 2.1、配置步驟 1、遙控器校準 在校準無線電系統之前&#xff0c;必須連接/綁定接收器和發射器。綁定發射器和接收器對的過程是特定于硬件的&#xff08;有關說明&#xff0c;請參閱 RC 手冊&…

Redis 有序集合 ZSet 深度解析教程

Redis-ZSet 引言一、 ZSet 核心概念與特性1.1 什么是 ZSet&#xff1f;1.2 ZSet 與 Set、List 的本質區別 二、 ZSet 典型應用場景2.1 排行榜 (Leaderboards)2.2 帶權重的任務隊列 / 延遲隊列2.3 時間軸 (Timeline)2.4 范圍查找 三、 ZSet 底層實現3.1 ziplist (壓縮列表)3.2 s…

【SpringBoot】HttpServletRequest獲取使用及失效問題(包含@Async異步執行方案)

目錄 1. 在 Controller 方法中作為參數注入 2.使用 RequestContextHolder &#xff08;1&#xff09;失效問題 &#xff08;2&#xff09;解決方案一&#xff1a; &#xff08;3&#xff09;解決方案二&#xff1a; 3、使用AutoWrite自動注入HttpServletRequest 跨線程調…

mfc學習(一)

mfc為微軟創建的一個類qt框架的客戶端程序&#xff0c;只不過因為微軟目前有自己 的親身兒子C#&#xff08;.net&#xff09;,所以到2010沒有進行維護。然后一些的工業企業還在繼續進行維護相關的內容。我目前就接手一個現在這樣的項目&#xff0c;其實本質與qt的思路是差不多的…

HarmonyOS:一多能力介紹:一次開發,多端部署

概述 如果一個應用需要在多個設備上提供同樣的內容&#xff0c;則需要適配不同的屏幕尺寸和硬件&#xff0c;開發成本較高。HarmonyOS 系統面向多終端提供了“一次開發&#xff0c;多端部署”&#xff08;后文中簡稱為“一多”&#xff09;的能力&#xff0c;可以基于一種設計…

秒出PPT推出更強版本,AI PPT工具進入新紀元!

在現代職場中&#xff0c;PPT是我們溝通和展示信息的重要工具。無論是做產品演示&#xff0c;還是準備工作匯報&#xff0c;一份精美的PPT能大大提升演示效果。然而&#xff0c;傳統的PPT制作往往需要消耗大量時間&#xff0c;尤其是在排版、設計和內容調整上。如今&#xff0c…

Godot開發2D冒險游戲——第二節:主角光環整起來!

變量的作用域 全局變量&#xff0c;局部變量&#xff0c;導出變量&#xff08;可以在檢查器當中快速查看&#xff09; 為玩家添加移動動畫 現在游戲的玩家還只是在滑行&#xff0c;我們需要再添加玩家每個方向上的移動效果 刪除原先的Item節點&#xff0c;創建一個動畫精靈…

顛覆傳統NAS體驗:耘想WinNAS讓遠程存儲如同本地般便捷

在當今數據爆炸的時代&#xff0c;網絡附加存儲(NAS)已成為許多企業和個人用戶的必備設備。然而&#xff0c;傳統硬件NAS解決方案存在諸多限制&#xff0c;如高額成本、復雜設置和有限的遠程訪問能力。耘想WinNAS以其創新的軟件解決方案&#xff0c;徹底改變了這一局面&#xf…

新市場環境下新能源汽車電流傳感技術發展前瞻

新能源革命重構產業格局 在全球碳中和戰略驅動下&#xff0c;新能源汽車產業正經歷結構性變革。國際清潔交通委員會&#xff08;ICCT&#xff09;最新報告顯示&#xff0c;2023年全球新能源汽車滲透率突破18%&#xff0c;中國市場以42%的市占率持續領跑。這種產業變革正沿著&q…

STM32之DHT11溫濕度傳感器---附代碼

DHT11簡介 DHT11的供電電壓為 3&#xff0d;5.5V。 傳感器上電后&#xff0c;要等待 1s 以越過不穩定狀態在此期間無需發送任何指令。 電源引腳&#xff08;VDD&#xff0c;GND&#xff09;之間可增加一個100nF 的電容&#xff0c;用以去耦濾波。 DATA 用于微處理器與DHT11之間…

#define STEUER_A_H {PWM_A_ON}

目錄 一、括號的區別 二、實例講解 三、注意事項 四、總結 五、補充 一、括號的區別 大括號 {}: 在 C/C 中&#xff0c;大括號一般用于表示一個代碼塊或結構體、集合等。例如&#xff1a; 用于定義函數體、控制結構&#xff08;如 if、for&#xff09;的代碼塊。用于初始化…

Redis 緩存—處理高并發問題

Redis的布隆過濾器、單線程架構、雙寫一致性、比較穿透、擊穿及雪崩、緩存更新方案及分布式鎖。 1 布隆過濾器 是一種高效的概率型數據結構&#xff0c;用于判斷元素是否存在。主要用于防止緩存穿透&#xff0c;通過攔截不存在的數據查詢&#xff0c;避免擊穿數據庫。 原理&…

【玩轉全棧】—— 無敵前端究極動態組件庫--Inspira UI

目錄 Inspira UI 介紹 配置環境 使用示例 效果&#xff1a; Inspira UI 學習視頻&#xff1a; 華麗優雅 | Inspira UI快速上手_嗶哩嗶哩_bilibili 官網&#xff1a;https://inspira-ui.com/ Inspira UI 介紹 Inspira UI 是一個設計精美、功能豐富的用戶界面庫&#xff0c;專為…

【OpenCV圖像處理實戰】從基礎操作到工業級應用

目錄 前言技術背景與價值當前技術痛點解決方案概述目標讀者說明 一、技術原理剖析核心概念圖解核心作用講解關鍵技術模塊說明技術選型對比 二、實戰演示環境配置要求核心代碼實現&#xff08;6個案例&#xff09;案例1&#xff1a;圖像基本操作案例2&#xff1a;邊緣檢測案例3&…

fastjson使用parseObject轉換成JSONObject出現將字符特殊字符解析解決

現象&#xff1a;將字符串的${TARGET_VALUE}轉換成NULL字符串了問題代碼&#xff1a; import com.alibaba.fastjson.JSON;JSONObject config JSON.parseObject(o.toString()); 解決方法&#xff1a; 1.更換fastjson版本 import com.alibaba.fastjson2.JSON;或者使用其他JS…

Docker Compose 和 Kubernetes(k8s)區別

前言&#xff1a;Docker Compose 和 Kubernetes&#xff08;k8s&#xff09;是容器化技術中兩個常用的工具&#xff0c;但它們的定位、功能和適用場景有顯著區別。以下是兩者的核心對比&#xff1a; ??1. 定位與目標?? ??特性?? ??Docker Compose?? ??Kubernet…

【21天學習打卡挑戰賽】如何學習WEB安全:逼自己在短時間掌握WEB安全核心內容

&#x1f36c; 博主介紹 &#x1f468;?&#x1f393; 博主介紹&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高興認識大家~ ?主攻領域&#xff1a;【滲透領域】【數據通信】 【通訊安全】 【web安全】【面試分析】 &#x1f389;點贊?評論?收藏 養成習…

Oracle數據庫巡檢腳本

1.查詢實例信息 SELECT INST_ID, INSTANCE_NAME, TO_CHAR(STARTUP_TIME, YYYY-MM-DD HH24:MI:SS) AS STARTUP_TIME FROM GV$INSTANCE ORDER BY INST_ID; 2.查看是否歸檔 archive log list 3.查看數據庫參數 SELECT NAME , TYPE , VALUE FROM V$PARAMETER ORDER BY NAME; 4.…

Windows 安裝 JDK

下載 Java8 的下載直接訪問&#xff1a;https://www.oracle.com/java/technologies/downloads/#java8-windows https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html 接受協議后點擊下載&#xff0c;再輸入賬號信息就可以下載了。 如果…

強化學習核心原理及數學框架

1. 定義與核心思想 強化學習&#xff08;Reinforcement Learning, RL&#xff09;是一種通過智能體&#xff08;Agent&#xff09;與環境&#xff08;Environment&#xff09;的持續交互來學習最優決策策略的機器學習范式。其核心特征為&#xff1a; ??試錯學習??&#x…