欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

image.png

1.找到入口

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

image.png

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

image.png

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

image.png

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

image.png

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

image.png

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

image.png

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

2.ConfigFileApplicationListener

2.1 主要流程分析

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

image.png

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

image.png

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

image.png

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

image.png

在進(jìn)入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文件中獲取,對應(yīng)的類型是 PropertySourceLoader類型。

image.png

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

image.png

到這Loader的構(gòu)造方法執(zhí)行完成了,然后來看下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)處理過的profile 類別
						this.processedProfiles = new LinkedList<>();
						// 默認(rèn)設(shè)置為未激活
						this.activatedProfiles = false;
						// 創(chuàng)建loaded對象
						this.loaded = new LinkedHashMap<>();
						// 加載配置 profile 的信息,默認(rèn)為 default
						initializeProfiles();
						// 遍歷 Profiles,并加載解析
						while (!this.profiles.isEmpty()) {
							// 從雙向鏈表中獲取一個profile對象
							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()方法中來查看。

image.png

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

image.png

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

image.png

image.png

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

image.png

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

image.png

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

image.png

再回到前面的方法

image.png

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

image.png

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

image.png

image.png

image.png

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

image.png

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

image.png

image.png

image.png

image.png

image.png

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

2.3 properties加載

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

image.png

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

image.png

此處是PropertiesPropertySourceLoader來加載的。

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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringMVC多個模塊404報錯問題及解決

    SpringMVC多個模塊404報錯問題及解決

    這篇文章主要介紹了SpringMVC多個模塊404報錯問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Spring Security在標(biāo)準(zhǔn)登錄表單中添加一個額外的字段

    Spring Security在標(biāo)準(zhǔn)登錄表單中添加一個額外的字段

    這篇文章主要介紹了Spring Security在標(biāo)準(zhǔn)登錄表單中添加一個額外的字段,我們將重點(diǎn)關(guān)注兩種不同的方法,以展示框架的多功能性以及我們可以使用它的靈活方式。 需要的朋友可以參考下
    2019-05-05
  • SpringBoot通過yml和xml文件配置日志輸出方法

    SpringBoot通過yml和xml文件配置日志輸出方法

    這篇文章主要介紹了SpringBoot通過yml和xml文件配置日志輸出方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04
  • java中for循環(huán)刪除集合陷阱

    java中for循環(huán)刪除集合陷阱

    java中在增強(qiáng)for循環(huán)為什么不能增刪集合呢?一個循環(huán)迭代,跟集合的增刪改沒什么關(guān)系。修改集合不是for去做的。for只管循環(huán)迭代,你在循環(huán)里邊修改集合,改變集合的長度,順序?qū)ρh(huán)都有影響
    2015-05-05
  • 將Java程序的輸出結(jié)果寫入文件方法實(shí)例

    將Java程序的輸出結(jié)果寫入文件方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于將Java程序的輸出結(jié)果寫入文件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Java內(nèi)存模型相關(guān)知識總結(jié)

    Java內(nèi)存模型相關(guān)知識總結(jié)

    這篇文章主要介紹了Java內(nèi)存模型相關(guān)知識總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • SpringCloud maven-assembly-plugin 多級目錄打包的實(shí)現(xiàn)

    SpringCloud maven-assembly-plugin 多級目錄打包的實(shí)現(xiàn)

    本文主要介紹了SpringCloud maven-assembly-plugin 多級目錄打包的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Mybatis?SqlSession案例詳解

    Mybatis?SqlSession案例詳解

    這篇文章主要介紹了Mybatis?SqlSession詳解,本文我們講了如何創(chuàng)建SqlSession的幾個步驟,最后我們獲得一個DefaultSqlSession對象,里面包含了執(zhí)行器Executor和配置對象Configuration,需要的朋友可以參考下
    2023-04-04
  • 使用Java編寫圖形化的菜單的教程

    使用Java編寫圖形化的菜單的教程

    這篇文章主要介紹了使用Java編寫圖形化的菜單的教程,需要的朋友可以參考下
    2015-10-10
  • 深入理解Spring?Boot中的Flyway

    深入理解Spring?Boot中的Flyway

    Flyway將數(shù)據(jù)庫結(jié)構(gòu)的變更定義為一系列遷移腳本,通常是SQL腳本文件,當(dāng)應(yīng)用程序啟動時,F(xiàn)lyway會自動檢測并執(zhí)行未應(yīng)用的遷移腳本,將數(shù)據(jù)庫升級到最新版本,這篇文章主要介紹了深入理解Spring?Boot中的Flyway,需要的朋友可以參考下
    2024-01-01

最新評論