最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2022年02月08日 15:10:20   作者:波波烤鴨  
這篇文章主要給大家介紹了關(guān)于SpringBoot源碼剖析之屬性文件加載原理的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

前言

首先我們來(lái)看一個(gè)問(wèn)題。就是我們?cè)趧?chuàng)建SpringBoot項(xiàng)目的時(shí)候會(huì)在對(duì)應(yīng)的application.properties或者application.yml文件中添加對(duì)應(yīng)的屬性信息,我們的問(wèn)題是這些屬性文件是什么時(shí)候被加載的?如果要實(shí)現(xiàn)自定義的屬性文件怎么來(lái)實(shí)現(xiàn)呢?本文來(lái)給大家揭曉答案:

image.png

1.找到入口

結(jié)合我們前面介紹的SpringBoot中的監(jiān)聽(tīng)事件機(jī)制,我們首先看下SpringApplication.run()方法,在該方法中會(huì)針對(duì)SpringBoot項(xiàng)目啟動(dòng)的不同的階段來(lái)發(fā)布對(duì)應(yīng)的事件。

image.png

處理屬性文件加載解析的監(jiān)聽(tīng)器是 ConfigFileApplicationListener ,這個(gè)監(jiān)聽(tīng)器監(jiān)聽(tīng)的事件有兩個(gè)。

image.png

而我們進(jìn)入SpringApplication.prepareEnvironment()方法中發(fā)布的事件其實(shí)就是ApplicationEnvironmentPreparedEvent事件。進(jìn)入代碼查看。

image.png

進(jìn)行進(jìn)入

image.png

繼續(xù)進(jìn)入會(huì)看到對(duì)應(yīng)的發(fā)布事件:ApplicationEnvironmentPreparedEvent

image.png

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

image.png

那么在此處觸發(fā)了配置環(huán)境的監(jiān)聽(tīng)器,后續(xù)的邏輯就應(yīng)該進(jìn)入對(duì)應(yīng)的

2.ConfigFileApplicationListener

2.1 主要流程分析

接下來(lái)我們看下ConfigFileApplicationListener中具體的如何來(lái)處理配置文件的加載解析的。

image.png

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

image.png

系統(tǒng)提供那4個(gè)不是重點(diǎn),重點(diǎn)是 ConfigFileApplicationListener 中的這個(gè)方法處理.

image.png

直接進(jìn)入ConfigFileApplicationListener.postProcessEnvironment()方法。

image.png

在進(jìn)入addPropertySources()方法中會(huì)完成兩個(gè)核心操作,1。創(chuàng)建Loader對(duì)象,2。調(diào)用Loader對(duì)象的load方法,

image.png

2.2 Loader構(gòu)造器

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

image.png

通過(guò)源碼我們可以發(fā)現(xiàn)在其中獲取到了屬性文件的加載器、從spring.factories文件中獲取,對(duì)應(yīng)的類(lèi)型是 PropertySourceLoader類(lèi)型。

image.png

而且在loadFactories方法中會(huì)完成對(duì)象的實(shí)例化。

image.png

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

void load() {
			FilteredPropertySource.apply(this.environment, DEFAULT_PROPERTIES, LOAD_FILTERED_PROPERTY,
					(defaultProperties) -> {
						// 創(chuàng)建默認(rèn)的profile 鏈表
						this.profiles = new LinkedList<>();
						// 創(chuàng)建已經(jīng)處理過(guò)的profile 類(lèi)別
						this.processedProfiles = new LinkedList<>();
						// 默認(rèn)設(shè)置為未激活
						this.activatedProfiles = false;
						// 創(chuàng)建loaded對(duì)象
						this.loaded = new LinkedHashMap<>();
						// 加載配置 profile 的信息,默認(rèn)為 default
						initializeProfiles();
						// 遍歷 Profiles,并加載解析
						while (!this.profiles.isEmpty()) {
							// 從雙向鏈表中獲取一個(gè)profile對(duì)象
							Profile profile = this.profiles.poll();
							// 非默認(rèn)的就加入,進(jìn)去看源碼即可清楚
							if (isDefaultProfile(profile)) {
								addProfileToEnvironment(profile.getName());
							}
							load(profile, this::getPositiveProfileFilter,
									addToLoaded(MutablePropertySources::addLast, false));
							this.processedProfiles.add(profile);
						}
						// 解析 profile
						load(null, this::getNegativeProfileFilter, addToLoaded(MutablePropertySources::addFirst, true));
						// 加載默認(rèn)的屬性文件 application.properties
						addLoadedPropertySources();
						applyActiveProfiles(defaultProperties);
					});
		}

然后我們進(jìn)入具體的apply()方法中來(lái)查看。

image.png

中間的代碼都有注釋?zhuān)饕翘幚韕rofile的內(nèi)容。

image.png

首先是getSearchLocations()方法,在該方法中會(huì)查詢(xún)默認(rèn)的會(huì)存放對(duì)應(yīng)的配置文件的位置,如果沒(méi)有自定義的話(huà),路徑就是 file:./config/ file:./ classpath:/config/ classpath:/ 這4個(gè)

image.png

image.png

然后回到load方法中,遍歷4個(gè)路徑,然后加載對(duì)應(yīng)的屬性文件。

image.png

getSearchNames()獲取的是屬性文件的名稱(chēng)。如果自定義了就加載自定義的

image.png

否則加載默認(rèn)的application文件。

image.png

再回到前面的方法

image.png

進(jìn)入load方法,會(huì)通過(guò)前面的兩個(gè)加載器來(lái)分別加載application.properties和application.yml的文件。

image.png

loader.getFileExtensions()獲取對(duì)應(yīng)的加載的文件的后綴。

image.png

image.png

image.png

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

image.png

繼續(xù)進(jìn)入load方法

image.png

image.png

image.png

image.png

image.png

開(kāi)始加載我們存在的application.properties文件。

2.3 properties加載

在找到了要加載的文件的名稱(chēng)和路徑后,我們來(lái)看下資源加載器是如何來(lái)加載具體的文件信息的。

image.png

進(jìn)入loadDocuments方法中,我們會(huì)發(fā)現(xiàn)會(huì)先從緩存中查找,如果緩存中沒(méi)有則會(huì)通過(guò)對(duì)應(yīng)的資源加載器來(lái)加載了。

image.png

此處是PropertiesPropertySourceLoader來(lái)加載的。

image.png

image.png

進(jìn)入loadProperties方法

image.png

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

image.png

總結(jié) 

到此這篇關(guān)于SpringBoot源碼剖析之屬性文件加載原理的文章就介紹到這了,更多相關(guān)SpringBoot屬性文件加載原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis之如何攔截慢SQL日志記錄

    Mybatis之如何攔截慢SQL日志記錄

    這篇文章主要介紹了Mybatis之如何攔截慢SQL日志記錄問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 使用Rhino讓java執(zhí)行javascript的方法實(shí)例

    使用Rhino讓java執(zhí)行javascript的方法實(shí)例

    這篇文章主要介紹了java使用Rhino執(zhí)行javascript的方法,Rhino由Mozilla開(kāi)發(fā),是 JavaScript 一種基于Java的實(shí)現(xiàn)
    2013-12-12
  • 詳解Mybatis動(dòng)態(tài)sql

    詳解Mybatis動(dòng)態(tài)sql

    MyBatis的動(dòng)態(tài)SQL是基于OGNL表達(dá)式的,它可以幫助我們方便的在SQL語(yǔ)句中實(shí)現(xiàn)某些邏輯。本文給大家介紹Mybatis動(dòng)態(tài)sql小結(jié),感興趣的朋友參考下
    2016-04-04
  • java實(shí)現(xiàn)簡(jiǎn)單的驗(yàn)證碼功能

    java實(shí)現(xiàn)簡(jiǎn)單的驗(yàn)證碼功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單的驗(yàn)證碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 淺談java異常處理(父子異常的處理)

    淺談java異常處理(父子異常的處理)

    下面小編就為大家?guī)?lái)一篇淺談java異常處理(父子異常的處理)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • Java通俗易懂系列設(shè)計(jì)模式之責(zé)任鏈模式

    Java通俗易懂系列設(shè)計(jì)模式之責(zé)任鏈模式

    這篇文章主要介紹了Java通俗易懂系列設(shè)計(jì)模式之責(zé)任鏈模式,對(duì)設(shè)計(jì)模式感興趣的同學(xué),一定要看一下
    2021-04-04
  • Java中Map與JSON數(shù)據(jù)之間的互相轉(zhuǎn)化

    Java中Map與JSON數(shù)據(jù)之間的互相轉(zhuǎn)化

    我們?cè)陂_(kāi)發(fā)中難免和JSON打交道,這不小編最近遇到了,需要把一些信息轉(zhuǎn)成JSON字符串,下面這篇文章主要給大家介紹了關(guān)于Java中Map與JSON數(shù)據(jù)之間的互相轉(zhuǎn)化,需要的朋友可以參考下
    2023-04-04
  • SpringBoot接口返回?cái)?shù)據(jù)脫敏(Mybatis、Jackson)

    SpringBoot接口返回?cái)?shù)據(jù)脫敏(Mybatis、Jackson)

    有時(shí)候,我們接口返回的數(shù)據(jù)需要做一些處理,有一些敏感數(shù)據(jù),本文主要介紹了SpringBoot接口返回?cái)?shù)據(jù)脫敏(Mybatis、Jackson),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-07-07
  • java 鍵盤(pán)輸入一個(gè)數(shù),輸出數(shù)組中指定元素的示例

    java 鍵盤(pán)輸入一個(gè)數(shù),輸出數(shù)組中指定元素的示例

    今天小編就為大家分享一篇java 鍵盤(pán)輸入一個(gè)數(shù),輸出數(shù)組中指定元素的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • 詳解Spring 兩種注入的方式(Set和構(gòu)造)實(shí)例

    詳解Spring 兩種注入的方式(Set和構(gòu)造)實(shí)例

    本篇文章主要介紹了Spring 兩種注入的方式(Set和構(gòu)造)實(shí)例,Spring框架主要提供了Set注入和構(gòu)造注入兩種依賴(lài)注入方式。有興趣的可以了解一下。
    2017-02-02

最新評(píng)論

永吉县| 定边县| 紫金县| 卓尼县| 宜春市| 上高县| 永泰县| 舟山市| 洛宁县| 铁岭县| 黑山县| 同德县| 河西区| 丘北县| 田阳县| 杨浦区| 阜城县| 黔西县| 景德镇市| 苍山县| 东乡| 永城市| 昔阳县| 贵港市| 龙胜| 淮阳县| 教育| 彰化市| 垦利县| 萨嘎县| 侯马市| 新化县| 伊宁市| 莒南县| 永川市| 德令哈市| 铜陵市| 桑植县| 宾川县| 屯门区| 长海县|