上文《一文掌握 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 下,所以只要留意當location
為classpath:/
的程式執**況即可。
由於springboot 配置檔案支援xml
,properties
,yml
格式,就需要不同 propertysourceloader 支援其檔案內容的載入:propertiespropertysourceloader 支援xml
,properties
檔案,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...