二維碼
        企資網(wǎng)

        掃一掃關(guān)注

        當前位置: 首頁 » 企資快訊 » 匯總 » 正文

        SpringBoot源碼之屬姓文件加載原理剖析

        放大字體  縮小字體 發(fā)布日期:2022-01-06 00:52:00    作者:百里長云    瀏覽次數(shù):21
        導讀

        請?zhí)砑又С置枋鯯pringBoot源碼之屬性文件加載原理剖析??首先我們來看一個問題。就是我們在創(chuàng)建SpringBoot項目得時候會在對應得application.properties或者application.yml文件中添加對應得屬性信息,我們得問題是

        請?zhí)砑又С置枋?/p>SpringBoot源碼之屬性文件加載原理剖析

        ??首先我們來看一個問題。就是我們在創(chuàng)建SpringBoot項目得時候會在對應得application.properties或者application.yml文件中添加對應得屬性信息,我們得問題是這些屬性文件是什么時候被加載得?如果要實現(xiàn)自定義得屬性文件怎么來實現(xiàn)呢?感謝來給大家揭曉答案:

        image.png

        1.找到入口

        ??結(jié)合我們前面介紹得SpringBoot中得監(jiān)聽事件機制,我們首先看下SpringApplication.run()方法,在該方法中會針對SpringBoot項目啟動得不同得階段來發(fā)布對應得事件。

        image.png

        ??處理屬性文件加載解析得監(jiān)聽器是 ConfigFileApplicationListener ,這個監(jiān)聽器監(jiān)聽得事件有兩個。

        image.png

        ??而我們進入SpringApplication.prepareEnvironment()方法中發(fā)布得事件其實就是ApplicationEnvironmentPreparedEvent事件。進入代碼查看。

        image.png

        進行進入

        image.png

        繼續(xù)進入會看到對應得發(fā)布事件:ApplicationEnvironmentPreparedEvent

        image.png

        ??結(jié)合上篇文件得內(nèi)容,我們知道在initialMulticaster中是有ConfigFileApplicationListener這個監(jiān)聽器得。

        image.png

        ??那么在此處觸發(fā)了配置環(huán)境得監(jiān)聽器,后續(xù)得邏輯就應該進入對應得

        2.ConfigFileApplicationListener2.1 主要流程分析

        ??接下來我們看下ConfigFileApplicationListener中具體得如何來處理配置文件得加載解析得。

        image.png

        ??根據(jù)邏輯我們直接進入onApplicationEnvironmentPreparedEvent()方法中。

        image.png

        ??系統(tǒng)提供那4個不是重點,重點是 ConfigFileApplicationListener 中得這個方法處理.

        image.png

        ??直接進入ConfigFileApplicationListener.postProcessEnvironment()方法。

        image.png

        ??在進入addPropertySources()方法中會完成兩個核心操作,1。創(chuàng)建Loader對象,2。調(diào)用Loader對象得load方法,

        image.png

        2.2 Loader構(gòu)造器

        ??現(xiàn)在我們來看下在Loader構(gòu)造器中執(zhí)行了什么操作。

        image.png

        ??通過源碼我們可以發(fā)現(xiàn)在其中獲取到了屬性文件得加載器、從spring.factories文件中獲取,對應得類型是 PropertySourceLoader類型。

        image.png

        ??而且在loadFactories方法中會完成對象得實例化。

        image.png

        ??到這Loader得構(gòu)造方法執(zhí)行完成了,然后來看下load()方法得執(zhí)行。先把代碼貼上

        1void load() { 2 FilteredPropertySource.apply(this.environment, DEFAULT_PROPERTIES, LOAD_FILTERED_PROPERTY, 3 (defaultProperties) -> { 4 // 創(chuàng)建默認得profile 鏈表 5 this.profiles = new linkedList<>(); 6 // 創(chuàng)建已經(jīng)處理過得profile 類別 7 this.processedProfiles = new linkedList<>(); 8 // 默認設置為未激活 9 this.activatedProfiles = false;10 // 創(chuàng)建loaded對象11 this.loaded = new linkedHashMap<>();12 // 加載配置 profile 得信息,默認為 default13 initializeProfiles();14 // 遍歷 Profiles,并加載解析15 while (!this.profiles.isEmpty()) {16 // 從雙向鏈表中獲取一個profile對象17 Profile profile = this.profiles.poll();18 // 非默認得就加入,進去看源碼即可清楚19 if (isDefaultProfile(profile)) {20 addProfileToEnvironment(profile.getName());21 }22 load(profile, this::getPositiveProfileFilter,23 addToLoaded(MutablePropertySources::addLast, false));24 this.processedProfiles.add(profile);25 }26 // 解析 profile27 load(null, this::getNegativeProfileFilter, addToLoaded(MutablePropertySources::addFirst, true));28 // 加載默認得屬性文件 application.properties29 addLoadedPropertySources();30 applyActiveProfiles(defaultProperties);31 });32 }

        ??然后我們進入具體得apply()方法中來查看。

        image.png

        ??中間得代碼都有注釋,主要是處理profile得內(nèi)容。

        image.png

        ??首先是getSearchLocations()方法,在該方法中會查詢默認得會存放對應得配置文件得位置,如果沒有自定義得話,路徑就是 file:./config/ file:./ classpath:/config/ classpath:/ 這4個

        image.png

        image.png

        ??然后回到load方法中,遍歷4個路徑,然后加載對應得屬性文件。

        image.png

        ??getSearchNames()獲取得是屬性文件得名稱。如果自定義了就加載自定義得

        image.png

        ??否則加載默認得application文件。

        image.png

        再回到前面得方法

        image.png

        進入load方法,會通過前面得兩個加載器來分別加載application.properties和application.yml得文件。

        image.png

        loader.getFileExtensions()獲取對應得加載得文件得后綴。

        image.png

        image.png

        image.png

        進入loadForFileExtension()方法,對profile和普通配置分別加載

        image.png

        繼續(xù)進入load方法

        image.png

        image.png

        image.png

        image.png

        image.png

        開始加載我們存在得application.properties文件。

        2.3 properties加載

        ??在找到了要加載得文件得名稱和路徑后,我們來看下資源加載器是如何來加載具體得文件信息得。

        image.png

        進入loaddocuments方法中,我們會發(fā)現(xiàn)會先從緩存中查找,如果緩存中沒有則會通過對應得資源加載器來加載了。

        image.png

        此處是PropertiesPropertySourceLoader來加載得。

        image.png

        image.png

        進入loadProperties方法

        image.png

        之后進入load()方法看到得就是具體得加載解析properties文件中得內(nèi)容了。感興趣得可以看下具體得邏輯,感謝就給大家介紹到這里了。

        image.png

        請?zhí)砑又С置枋?/p>

         
        (文/百里長云)
        免責聲明
        本文僅代表作發(fā)布者:百里長云個人觀點,本站未對其內(nèi)容進行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內(nèi)容,一經(jīng)發(fā)現(xiàn),立即刪除,需自行承擔相應責任。涉及到版權(quán)或其他問題,請及時聯(lián)系我們刪除處理郵件:weilaitui@qq.com。
         

        Copyright ? 2016 - 2025 - 企資網(wǎng) 48903.COM All Rights Reserved 粵公網(wǎng)安備 44030702000589號

        粵ICP備16078936號

        微信

        關(guān)注
        微信

        微信二維碼

        WAP二維碼

        客服

        聯(lián)系
        客服

        聯(lián)系客服:

        在線QQ: 303377504

        客服電話: 020-82301567

        E_mail郵箱: weilaitui@qq.com

        微信公眾號: weishitui

        客服001 客服002 客服003

        工作時間:

        周一至周五: 09:00 - 18:00

        反饋

        用戶
        反饋

        主站蜘蛛池模板: 国产欧美一区二区精品仙草咪| 91精品一区二区三区在线观看| 久久国产一区二区| 无码午夜人妻一区二区不卡视频| 国产综合无码一区二区色蜜蜜| 国产SUV精品一区二区88L| 视频一区二区中文字幕| 国产日韩精品一区二区三区在线 | 精品亚洲A∨无码一区二区三区| 91精品福利一区二区三区野战| 天海翼一区二区三区高清视频 | 亚洲一区精品无码| 国产精品视频一区二区三区无码| 蜜臀Av午夜一区二区三区| 国产一区二区三区小说| 国产成人无码精品一区在线观看| 日本在线不卡一区| 日韩伦理一区二区| 亚洲成AV人片一区二区| 在线|一区二区三区四区| 激情综合一区二区三区| 在线观看精品视频一区二区三区| 亚洲av无码天堂一区二区三区| 精品无码人妻一区二区三区 | 麻豆亚洲av熟女国产一区二| 国内精品一区二区三区在线观看| 国产日韩AV免费无码一区二区| 亚洲av综合av一区二区三区| 日本一区午夜艳熟免费| 国产精品va一区二区三区| 国产激情视频一区二区三区| 精品无码中出一区二区| 国产精品夜色一区二区三区| 久久无码一区二区三区少妇| 天海翼一区二区三区高清视频| 久久久无码一区二区三区 | 国精产品一区二区三区糖心| 国产福利无码一区在线| 精品国产一区二区三区不卡| 国模精品一区二区三区| 日本丰满少妇一区二区三区|