<strike id="ca4is"><em id="ca4is"></em></strike>
  • <sup id="ca4is"></sup>
    • <s id="ca4is"><em id="ca4is"></em></s>
      <option id="ca4is"><cite id="ca4is"></cite></option>
    • 二維碼
      企資網

      掃一掃關注

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

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

      放大字體  縮小字體 發布日期:2022-01-06 00:52:00    作者:百里長云    瀏覽次數:24
      導讀

      請添加支持描述SpringBoot源碼之屬性文件加載原理剖析??首先我們來看一個問題。就是我們在創建SpringBoot項目得時候會在對應得application.properties或者application.yml文件中添加對應得屬性信息,我們得問題是

      請添加支持描述

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

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

      image.png

      1.找到入口

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

      image.png

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

      image.png

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

      image.png

      進行進入

      image.png

      繼續進入會看到對應得發布事件:ApplicationEnvironmentPreparedEvent

      image.png

      ??結合上篇文件得內容,我們知道在initialMulticaster中是有ConfigFileApplicationListener這個監聽器得。

      image.png

      ??那么在此處觸發了配置環境得監聽器,后續得邏輯就應該進入對應得

      2.ConfigFileApplicationListener2.1 主要流程分析

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

      image.png

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

      image.png

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

      image.png

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

      image.png

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

      image.png

      2.2 Loader構造器

      ??現在我們來看下在Loader構造器中執行了什么操作。

      image.png

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

      image.png

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

      image.png

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

      1void load() { 2 FilteredPropertySource.apply(this.environment, DEFAULT_PROPERTIES, LOAD_FILTERED_PROPERTY, 3 (defaultProperties) -> { 4 // 創建默認得profile 鏈表 5 this.profiles = new linkedList<>(); 6 // 創建已經處理過得profile 類別 7 this.processedProfiles = new linkedList<>(); 8 // 默認設置為未激活 9 this.activatedProfiles = false;10 // 創建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得內容。

      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

      繼續進入load方法

      image.png

      image.png

      image.png

      image.png

      image.png

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

      2.3 properties加載

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

      image.png

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

      image.png

      此處是PropertiesPropertySourceLoader來加載得。

      image.png

      image.png

      進入loadProperties方法

      image.png

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

      image.png

      請添加支持描述

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

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

      粵ICP備16078936號

      微信

      關注
      微信

      微信二維碼

      WAP二維碼

      客服

      聯系
      客服

      聯系客服:

      在線QQ: 303377504

      客服電話: 020-82301567

      E_mail郵箱: weilaitui@qq.com

      微信公眾號: weishitui

      客服001 客服002 客服003

      工作時間:

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

      反饋

      用戶
      反饋

      午夜久久久久久网站,99久久www免费,欧美日本日韩aⅴ在线视频,东京干手机福利视频
        <strike id="ca4is"><em id="ca4is"></em></strike>
      • <sup id="ca4is"></sup>
        • <s id="ca4is"><em id="ca4is"></em></s>
          <option id="ca4is"><cite id="ca4is"></cite></option>
        • 主站蜘蛛池模板: 国产一区二区三区不卡在线观看| 成年男女免费视频网站| 国产精品久久毛片| 亚洲国产日韩欧美| 69性欧美高清影院| 欧美日韩精品一区二区三区四区 | 99re最新地址精品视频| 激情内射日本一区二区三区| 奇米视频7777| 人人狠狠综合久久亚洲婷婷| gay在线看www| 菠萝蜜亏亏带痛声的视频| 欧美人与物videos另| 国产男女爽爽爽免费视频| 亚洲AV成人片无码网站| 91色视频网站| 日本乱妇bbwbbw| 和主人玩露出调教暴露羞耻| 七仙女欲春2一级裸片免费观看| 精品久久久久久无码专区| 女人被男人躁到呻吟的| 人人爽天天碰天天躁夜夜躁| 99国产精品99久久久久久| 欧美日韩精品在线播放| 国产男女爽爽爽爽爽免费视频| 五月婷婷六月天| 触手强制h受孕本子里番| 成人观看网站a| 伊人精品视频一区二区三区| 99re在线免费视频| 欧美jizz18性欧美| 国产亚洲精品资源在线26U| 亚洲av中文无码乱人伦| 韩国三级hd中文字幕| 成在人线av无码免费高潮水| 伊人色院成人蜜桃视频| 69av视频在线观看| 日韩欧美在线观看一区| 嗯啊~被触手怪女性灌液漫画| ipx-412天海翼在线播放| 欧美成人猛男性色生活|