【Spring Boot 源碼學習】初識 ConfigurableEnvironment

《Spring Boot 源碼學習系列》

在這里插入圖片描述

初識 ConfigurableEnvironment

  • 一、引言
  • 二、主要內容
    • 2.1 Environment
      • 2.1.1 配置文件(profiles)
      • 2.1.2 屬性(properties)
    • 2.2 ConfigurablePropertyResolver
      • 2.2.1 屬性類型轉換配置
      • 2.2.2 占位符配置
      • 2.2.3 值分隔符配置
      • 2.2.4 必需屬性驗證配置
    • 2.3 ConfigurableEnvironment
      • 2.3.1 接口方法
      • 2.3.2 具體實現
  • 三、總結

一、引言

上篇博文,Huazie 帶大家深入分析下 ApplicationArguments 接口及其默認實現。在初始化完 ApplicationArguments 之后,Spring Boot 就開始通過 prepareEnvironment 方法對 ConfigurableEnvironment 對象進行初始化操作。在介紹 ConfigurableEnvironment 的初始化之前,我們有必要先認識一下 ConfigurableEnvironment 接口。

在這里插入圖片描述

二、主要內容

注意: 以下涉及 Spring Boot 源碼 均來自版本 2.7.9,其他版本有所出入,可自行查看源碼。

下面貼出 ConfigurableEnvironment 的源碼:

public interface ConfigurableEnvironment extends Environment, ConfigurablePropertyResolver {void setActiveProfiles(String... profiles);void addActiveProfile(String profile);void setDefaultProfiles(String... profiles);MutablePropertySources getPropertySources();Map<String, Object> getSystemProperties();Map<String, Object> getSystemEnvironment();void merge(ConfigurableEnvironment parent);
}

從上述源碼,可以看出 ConfigurableEnvironment 接口繼承了 EnvironmentConfigurablePropertyResolver 接口,它們其實最終都繼承自 PropertyResolver 接口。

2.1 Environment

在這里插入圖片描述

org.springframework.core.env.Environment 表示當前應用程序在其中運行的環境。它模擬了應用程序環境的兩個關鍵方面:

2.1.1 配置文件(profiles)

Profile 是一個命名的、邏輯上的 bean 定義組,這些定義只有在給定的配置文件處于活動狀態時才會被注冊到容器中。通過 Environment 可以確定哪些配置文件(如果有)當前是活動的,以及哪些配置文件(如果有)應該默認是活動的。可以使用 @Profile 注解來指定 bean 應該在哪個配置文件下被注冊。

2.1.2 屬性(properties)

屬性有各種來源,如屬性文件JVM 系統屬性系統環境變量JNDIservlet 上下文參數臨時的 Properties 對象Map 等。Environment 對象為用戶提供了一個方便的服務接口,用于配置屬性源并從這些源中解析屬性。通過 Environment,可以方便地訪問和解析這些屬性,而無需直接操作這些源。

此外,Environment 接口還繼承了 PropertyResolver 接口【用于根據任何底層源解析屬性的接口】,這意味著它還提供了與屬性訪問相關的功能。

2.2 ConfigurablePropertyResolver

在這里插入圖片描述

org.springframework.core.env.ConfigurablePropertyResolver 也繼承了 PropertyResolver 接口,并在其基礎上增加了更多的配置選項:

2.2.1 屬性類型轉換配置

ConfigurablePropertyResolver 提供了基于 org.springframework.core.convert.ConversionService 的屬性類型轉換功能。ConversionServiceSpring 中用于類型轉換的接口,它允許將一種類型的對象轉換為另一種類型的對象。

與之關聯的方法如下:

  • getConversionService() : 獲取當前用于類型轉換的 ConfigurableConversionService 實例。
  • setConversionService(ConfigurableConversionService conversionService): 設置用于類型轉換的 ConfigurableConversionService 實例。這允許用戶自定義類型轉換的邏輯,以滿足特定的應用程序需求。

2.2.2 占位符配置

ConfigurablePropertyResolver 允許開發者配置占位符的前綴和后綴。默認情況下,前綴是 ${,后綴是 }。占位符的值本身也可以包含其他占位符,形成嵌套占位符,ConfigurablePropertyResolver 支持嵌套占位符的解析。

與之相關的方法如下:

  • setPlaceholderPrefix(String placeholderPrefix) : 設置占位符的前綴。在解析屬性時,這些前綴將被用來識別需要替換的占位符。
  • setPlaceholderSuffix(String placeholderSuffix) : 設置占位符的后綴。與前綴一起,它們定義了占位符的完整格式。
  • setIgnoreUnresolvableNestedPlaceholders(boolean ignoreUnresolvableNestedPlaceholders) : 設置是否忽略無法解析的嵌套占位符。如果設置為 true,則當遇到無法解析的嵌套占位符時,解析器將不會拋出異常,而是繼續執行。

2.2.3 值分隔符配置

值分隔符是指在解析屬性值時,用于分隔占位符與其關聯默認值的字符設置。

比如,在配置文件中有這樣的屬性值:${propertyName:defaultValue}

在這里 propertyName 是占位符,而 defaultValue 是在 propertyName 無法解析時使用的默認值。那顯然在上述示例中,: 就是 值分隔符

與之相關的方法如下:

  • setValueSeparator(@Nullable String valueSeparator) : 設置值分隔符。在某些情況下,屬性值可能包含多個值,這些值由分隔符分隔。此方法允許用戶指定分隔符。

2.2.4 必需屬性驗證配置

必需屬性驗證配置是 Spring 框架中用于確保應用程序配置中包含某些關鍵屬性的一種機制。

與之相關的方法如下:

  • setRequiredProperties(String... requiredProperties): 設置必需的屬性。這些屬性必須在解析過程中存在,否則驗證將失敗。
  • validateRequiredProperties() throws MissingRequiredPropertiesException : 驗證是否所有必需的屬性都已設置。如果任何必需屬性缺失,此方法將拋出 MissingRequiredPropertiesException 異常。

2.3 ConfigurableEnvironment

了解了 EnvironmentConfigurablePropertyResolver,我們再來看看 ConfigurableEnvironment

2.3.1 接口方法

ConfigurableEnvironment 代表了一個可配置的環境,其定義了如下的方法:

  • setActiveProfiles(String... profiles) :設置當前激活的 Profile 組集合。在Spring 中,Profile 允許用戶根據特定的環境(如開發、測試、生產)加載不同的配置。通過傳遞一個或多個 Profile 名稱作為參數,你可以激活這些 Profile
  • addActiveProfile(String profile) :向當前激活的 Profile 組集合中添加一個 Profile 組。
  • setDefaultProfiles(String... profiles) :設置默認激活的 Profile 組集合。激活的 Profile 組集合為空時,會默認實用默認的 Profile 組集合。
  • getPropertySources() :返回當前環境的 MutablePropertySources 對象。PropertySources 是一個包含多個 PropertySource 的列表,每個PropertySource 都可以提供屬性。MutablePropertySources 允許你添加、替換或刪除 PropertySource
  • getSystemProperties() :返回 Java 系統屬性的映射。這些屬性是 JVM 啟動時通過 -D 參數或系統屬性文件(如system.properties)設置的。
  • getSystemEnvironment() :返回操作系統環境變量的映射。這些變量通常包含關于系統配置和運行時的信息。
  • merge(ConfigurableEnvironment parent) :將父 ConfigurableEnvironment 的屬性源合并到當前環境中。合并時,父環境的屬性源將添加到當前環境的屬性源列表的開頭,從而允許它們覆蓋當前環境的任何同名屬性。

2.3.2 具體實現

org.springframework.core.env.AbstractEnvironment 是一個抽象類,實現了 ConfigurableEnvironment 接口,為環境配置(如屬性源和概要文件管理)提供了基本的支持

org.springframework.core.env.StandardEnvironment 繼承自 AbstractEnvironment,應用于非 Web 環境。它是 Spring 中默認的環境配置類,負責讀取系統屬性、環境變量以及配置文件中的配置信息,并將其封裝在一個 PropertySources 對象中供 Spring 應用程序使用。

org.springframework.web.context.support.StandardServletEnvironment 繼承自 StandardEnvironment,它是基于 ServletWeb 應用程序要使用的 Environment 實現。所有基于 ServletWeb 相關的 ApplicationContext 類都會默認初始化一個實例。提供 ServletConfigServletContext 和基于 JNDIPropertySource 實例。在初始化過程中,會根據 ServletContextServletConfig 的可用性來初始化和配置屬性源。通過 customizePropertySources() 方法,可以自定義屬性源的添加順序和配置方式。

org.springframework.mock.env.MockEnvironment 繼承自 AbstractEnvironment,它用于測試目的,可以模擬環境變量和系統屬性的值。

三、總結

本篇博文 Huazie 同大家一起了解了 ConfigurableEnvironment 接口和其父接口,這些對于后續理解 ConfigurableEnvironment 的初始化操作至關重要。接下來的博文將會繼續聚焦 Spring Boot 啟動運行階段,敬請期待!!!

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

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

相關文章

wxss和css有什么區別?

WXSS&#xff08;WeiXin Style Sheets&#xff09;和CSS&#xff08;Cascading Style Sheets&#xff09;在功能和應用上有很多相似之處&#xff0c;但針對微信小程序的特殊需求&#xff0c;WXSS對CSS進行了一些擴展和修改。以下是WXSS和CSS之間的主要區別&#xff1a; 尺寸單…

Mybatis實現流程

一&#xff0c;UserDAO 接口定義 首先&#xff0c;定義 UserDAO接口&#xff0c;包含 getList()方法,定義類型為List<User>&#xff1a; package dao;import model.User; import java.util.List;public interface UserDAO {List<User> getList(); }二&#xff0c…

Python--進程基礎

創建進程 os.fork() 該方法只能在linux和mac os中使用&#xff0c;因為其主要基于系統的fork來實現。window中沒有這個方法。 通過os.fork()方法會創建一個子進程&#xff0c;子進程的程序集為該語句下方的所有語句。 import os??print("主進程的PID為:" , os.g…

Python pdfkit wkhtmltopdf html轉換pdf 黑體字體亂碼

wkhtmltopdf 黑體在html轉換pdf時&#xff0c;黑體亂碼&#xff0c;分析可能wkhtmltopdf對黑體字體不太兼容&#xff1b; 1.html內容如下 <html> <head> <meta http-equiv"content-type" content"text/html;charsetutf-8"> </head&…

DreamView數據流

DreamView數據流 查看DV中界面啟動dag&#xff0c;/apollo/modules/dreamview_plus/conf/hmi_modes/pnc.pb.txt可以看到點擊界面的planning按鈕&#xff0c;后臺其實啟動的是/apollo/modules/planning/planning_component/dag/planning.dag和/apollo/modules/external_command…

語音識別應用Python示例

語音識別是將語音信號轉換為文本的技術&#xff0c;是人工智能領域的重要研究方向之一。下面是一個基于Python的簡單語音識別應用的代碼示例。 首先&#xff0c;需要安裝Python的語音識別庫SpeechRecognition。可以使用以下命令進行安裝&#xff1a; pip install SpeechRecog…

版本號比較

版本號比較&#xff1a; 注意&#xff1a; 不可以直接使用字符串比較的方法進行版本號比較。例如 2.29.1 > 2.3.0 是 false 的 版本號比較可以參考以下代碼&#xff1a; function compareVersion(v1, v2) {v1 v1.split(.)v2 v2.split(.)const len Math.max(v1.length, …

Oracle連接mysql

oracle使用的11g&#xff0c;在一臺windows服務器&#xff1b;mysql使用的是5.7版本&#xff0c;在另一臺windows服務器&#xff0c;這兩個服務器之間的網絡是互通的。做BI時&#xff0c;要獲取不同數據源的數據&#xff0c;這些數據源可能是Oracle&#xff0c;也可能是sqlserv…

springboot基礎入門2(profile應用)

Profile應用 一、何為Profile二、profile配置方式1.多profile文件方式2.yml多文檔方式 三、加載順序1. file:./config/: 當前項目下的/config目錄下2. file:./ &#xff1a;當前項目的根目錄3. classpath:/config/:classpath的/config目錄4. classpath:/ : classpath的根目錄 四…

【設計模式】【創建型5-2】【工廠方法模式】

文章目錄 工廠方法模式工廠方法模式的結構示例產品接口具體產品工廠接口具體工廠客戶端代碼 實際的使用 工廠方法模式 工廠方法模式的結構 產品&#xff08;Product&#xff09;&#xff1a;定義工廠方法所創建的對象的接口。 具體產品&#xff08;ConcreteProduct&#xff0…

Redis 集群模式

一、集群模式概述 Redis 中哨兵模式雖然提高了系統的可用性&#xff0c;但是真正存儲數據的還是主節點和從節點&#xff0c;并且每個節點都存儲了全量的數據&#xff0c;此時&#xff0c;如果數據量過大&#xff0c;接近或超出了 主節點 / 從節點機器的物理內存&#xff0c;就…

個人網站制作 Part 28 添加用戶活動跟蹤功能 | Web開發項目添加頁面緩存

文章目錄 &#x1f469;?&#x1f4bb; 基礎Web開發練手項目系列&#xff1a;個人網站制作&#x1f680; 添加用戶活動跟蹤功能&#x1f528;使用分析工具&#x1f527;步驟 1: 選擇分析工具&#x1f527;步驟 2: 注冊Google Analytics賬戶&#x1f527;步驟 3: 獲取Analytics…

Java面試題--JVM大廠篇之深入了解G1 GC:高并發、響應時間敏感應用的最佳選擇

引言&#xff1a; 在現代Java應用的性能優化中&#xff0c;垃圾回收器&#xff08;GC&#xff09;的選擇至關重要。對于高并發、響應時間敏感的應用而言&#xff0c;G1 GC&#xff08;Garbage-First Garbage Collector&#xff09;無疑是一個強大的工具。本文將深入探討G1 GC適…

李一桐遭遇蜈蚣驚魂

李一桐遭遇“蜈蚣驚魂”&#xff01;劉宇寧展現真男人本色在娛樂圈的幕后&#xff0c;總有一些心跳加速的驚險。近日&#xff0c;李一桐在拍戲時遭遇了一場“蜈蚣驚魂”&#xff0c;讓無數粉絲和網友為她捏了一把冷汗。而在這場驚險的遭遇中&#xff0c;劉宇寧展現出了真男人的…

NOI大綱——普及組——二叉搜索樹

二叉搜索樹 二叉搜索樹&#xff08;Binary Search Tree&#xff0c;簡稱BST&#xff09;是一種特殊的二叉樹&#xff0c;它具有以下幾個特點&#xff1a; 節點的左子樹上的所有節點的值都小于或等于該節點的值。節點的右子樹上的所有節點的值都大于或等于該節點的值。每個節點…

ActiveMq工具之管理頁面說明

文章目錄 安裝ActiveMQ一: 訪問管理頁面二: 進入管理頁面&#xff0c;主頁三: Queues頁說明四: Topics頁說明五: Subscribers頁說明 安裝ActiveMQ wget https://archive.apache.org/dist//activemq/5.13.3/apache-activemq-5.13.3-bin.tar.gz wget https://mirrors.huaweiclou…

為什么越來越多的企業選擇外包?賦能企業未來

軟件開發過程包括設計需求、設計方案、產品研發、產品交付、后期維護&#xff0c;許多企業并沒有軟件開發的專業能力與工作經驗&#xff0c;將軟件開發工作進行外包是比較節約成本的&#xff0c;企業能少走不少彎路。 YesPMP平臺&#xff08;一站式軟件外包、項目外包服務-YesP…

UWA Pipeline 2.6.1版本更新

UWA Pipeline是專為游戲開發團隊設計的本地協作平臺&#xff0c;旨在幫助團隊建立專業的DevOps研發交付流水線。本平臺提供了可視化的CI/CD操作界面&#xff0c;高可用的自動化測試和無縫集成的UWA性能保障服務等核心功能。 在最新的Pipeline更新中&#xff0c;UWA引入了參數配…

protobufjs解析proto消息出錯RangeError: index out of range: 2499 + 10 > 2499解決辦法

使用websocket通訊傳輸protobuf消息的時候&#xff0c;decode的時候出錯了&#xff1a; RangeError: index out of range: 2499 10 > 2499 Error: invalid wire type 4 at offset 1986 出現這種錯誤的時候&#xff0c;99%是因為proto里面的消息類型和服務端發送的消息類型不…

vue表頭字段添加鼠標懸浮提示

<el-table-column prop"jfScore" align"center" min-width"100px"><template slot"header" slot-scope"scope"><div><span>信用積分</span><el-tooltip:aa"scope"class"it…