原始碼解讀 Spring Boot Profiles

2022-07-03 22:12:11 字數 2239 閱讀 3250

上文《一文掌握 spring boot profiles》 是對 spring boot profiles 的介紹和使用,因此本文將從原始碼角度** spring boot profiles,讓我們看下 spring boot 底層是如何應用 profiles 進行環境配置的隔離與生效的。

首先,我們先來看下乙個簡單的 spring boot 示例程式,

在主程式方法中,列印容器中獲取到 user 物件,它只有乙個name屬性。

再次重啟啟動程式,可以看到控制台如下日誌:

我們主要看這個方法中的是三個方法:

第乙個方法initializeprofiles初始化 profiles,給profiles屬性新增兩個元素,null和 預設的profile。

第二個方法addprofiletoenvironment就是將 profile 新增到environment物件的activeprofiles裡,也就是最開始日誌列印的activeprofiles

第三個方法就是載入配置檔案的資料來源和 profies 相關的屬性。

由於我們的配置檔案在 classpath 下,所以只要留意當locationclasspath:/的程式執**況即可。

由於springboot 配置檔案支援xmlpropertiesyml格式,就需要不同 propertysourceloader 支援其檔案內容的載入:propertiespropertysourceloader 支援xmlproperties檔案,yamlpropertysourceloader 支援 yml 檔案,載入以.yml.yaml字尾的檔案,loader#loadforfileextension方法就完成了對這些配置檔案的載入。

我們示例程式只有properties檔案,所以只需要關注當loader為 propertiespropertysourceloader時的loader#loadforfileextension方法的執**況。

!](至此,所有配置檔案上的資料載入完儲存到了與當前上下文關聯的environment物件中,將prod作為 active profile 啟用特定環境配置的工作就完成了。

雖然只是** spring boot 程式如何載入和應用 profile,但通過這次原始碼分析,我們可以發現 springboot 雖簡單易用,但是內部實現邏輯設計是比較複雜的,無論是資源的載入,資料的解析都有專門的元件類去處理,大量使用事件通知和設計模式,在分析原始碼時少不了一次又一次的執行斷點,不過這需要我們充分利用de工具除錯功能,在錯綜複雜的**中能更準確地定位目標。

openTLD 原始碼解讀

首先是run tld 在其次就是tldexample 最後到了初始化函式tldinit 第乙個比較關鍵的函式 bb scan 將影象網格化,將首先 scale 1.2.10 10 21 個規格 在每個規格上打網格 這個函式有乙個比較重要的方法 ntuples 就是重複 因為網格上的點很多點有相同的x...

thinkphp原始碼解讀

thinkphp原始碼解讀 thinkphp原始碼的根目錄下是 index.php,是系統預設的 主頁,index.php中首先檢測的是 php執行環境,如果php版本小於 5.3.0則退出執行,定義是否為除錯模式,定義應用目錄,引入入口檔案。thinkphp是整個框架的入口檔案,在thinkphp...

HashMap原始碼解讀

一 建立乙個hashmap都做了哪些工作?mapmap new hashmap hahmap無參構造方法 public hashmap 可以看到設定了載入因子 預設0.75 閾值 預設容量16 預設載入因子0.75 12 table是hashmap內部資料儲存結構entry陣列。當hashmap的s...