詳解springboot啟動時是如何加載配置文件application.yml文件
今天啟動springboot時,明明在resources目錄下面配置了application.yml的文件,但是卻讀不出來,無奈看了下源碼,總結(jié)一下springboot查找配置文件路徑的過程,能力有限,歡迎各位大牛指導(dǎo)?。?!
spring加載配置文件是通過listener監(jiān)視器實現(xiàn)的,在springboot啟動時:

在容器啟動完成后會廣播一個SpringApplicationEvent事件,而SpringApplicationEvent事件是繼承自ApplicationEvent時間的,代碼如下:


由于ConfigFileApplicationListener監(jiān)聽器實現(xiàn)了SmartApplicationListener接口,而SmartApplicationListener接口繼承了ApplicationListener<ApplicationEvent>接口,所以能監(jiān)聽到上面廣播出來的SpringApplicationEvent事件,類的繼承圖如下:

SmartApplicationListener是繼承自ApplicationListener:

在ConfigFileApplicationListener中監(jiān)聽事件的方法:

postProcessEnvironment方法是查找application.yml配置文件的入口方法:

在load方法里面才是真正查找配置文件的過程:

默認先讀取的是location,然后是配置文件的名字“application”,最后才是文件類型“properties”或者“yml”;
localtion有多種,可以自行debug:有file:./和file:./config和classpath等目錄;
文件類型默認的有四種:properties、xml、yml、yaml
最后查找的具體路徑:location + name + "-" + profile + "." + ext

根據(jù)拼出來的路徑去查找配置文件,一般配置文件都放在classpath目錄下面,當讀取到classpath目錄下的配置文件的時候,程序去加載配置文件:


當加載配置文件時,程序先會讀取配置文件的spring.profiles.active屬性,確定加載什么環(huán)境的配置文件(我是加載dev的):

然后在讀取到的配置文件的屬性加載到profiles隊列中重新加載配置文件,代碼如下,所以任何項目都必須現(xiàn)有一個基礎(chǔ)的配置文件,如application.yml,然后在這個配置文件里面有一個active屬性;

程序會先拿到這個屬性,放到profiles屬性中,重新去加載配置文件如application-dev.yml,程序如下:


注:這篇文章是為了解決配置文件找不到而寫的,是為了解決問題而寫的,主要是解析查找配置文件路徑的過程,具體的解析配置文件的過程,讀者可以細看源碼,最后我也找到了配置文件為什么找不到的原因,主要是因為idea編譯時,classpath路徑下面沒有application.yml文件,復(fù)制配置文件到classpath目錄下,問題就解決了!
到此這篇關(guān)于詳解springboot啟動時是如何加載配置文件application.yml文件的文章就介紹到這了,更多相關(guān)springboot啟動加載application.yml內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot使用Cache集成Redis做緩存的保姆級教程
Spring Cache是Spring框架提供的一個緩存抽象層,它簡化了緩存的使用和管理,Spring Cache默認使用服務(wù)器內(nèi)存,并無法控制緩存時長,查找緩存中的數(shù)據(jù)比較麻煩,本文已常用的Redis作為緩存中間件作為示例,詳細講解項目中如何使用Cache提高系統(tǒng)性能,需要的朋友可以參考下2025-01-01
Character.UnicodeBlock中cjk的說明詳解
這篇文章主要為大家詳細介紹了Character.UnicodeBlock中cjk的說明,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09
Spring3 MVC請求參數(shù)獲取的幾種方法小結(jié)
本篇文章主要介紹了Spring3 MVC請求參數(shù)獲取的幾種方法小結(jié),非常具有實用價值,需要的朋友可以參考下。2017-03-03
Java簡單統(tǒng)計字符串中漢字,英文字母及數(shù)字數(shù)量的方法
這篇文章主要介紹了Java簡單統(tǒng)計字符串中漢字,英文字母及數(shù)字數(shù)量的方法,涉及java針對字符串的遍歷、編碼轉(zhuǎn)換、判斷等相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
舉例講解Java設(shè)計模式編程中模板方法模式的運用實例
這篇文章主要介紹了Java設(shè)計模式編程中模板方法模式的運用實例,模板方法模式強調(diào)基于繼承的代碼復(fù)用,需要的朋友可以參考下2016-05-05
Java中轉(zhuǎn)義字符反斜杠\的代替方法及repalceAll內(nèi)涵解析
這篇文章主要介紹了Java中轉(zhuǎn)義字符反斜杠\的代替方法及repalceAll內(nèi)涵解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08

