springboot默認(rèn)的5種加載路徑詳解
前言
上次分享了如何一步一步搭建一個(gè)springboot的項(xiàng)目,詳細(xì)參見《5分鐘快速搭建一個(gè)springboot的項(xiàng)目》,最終的結(jié)果是在”8080“端口搭建起了服務(wù),并成功訪問。不知道有小伙伴是否有疑惑,springboot應(yīng)該有配置文件的,一般的配置文件都是application.properties或者application.yml,的確是這樣的。但是我確實(shí)沒有這些配置文件,服務(wù)正常在”8080“端口啟動(dòng),這是因?yàn)樵趕pringboot內(nèi)部有一套默認(rèn)的機(jī)制。今天不聊這些默認(rèn)的機(jī)制,聊一聊application.properties/application.yml文件。
一、application.properties/.yml文件初識(shí)
前面說到?jīng)]有配置application.properties文件,現(xiàn)在我在main/resources文件夾下新建一個(gè)application.properties文件,并且寫上如下的配置
然后,啟動(dòng)項(xiàng)目,
好了,通過上面的啟動(dòng)結(jié)果截圖,看到服務(wù)在端口”9090“啟動(dòng)了。那么如果在該目錄下在配置一個(gè)application.yml文件吶,
啟動(dòng)結(jié)果如下,
可以看到依然是在端口”9090“啟動(dòng)服務(wù)。為此得出這樣個(gè)結(jié)論:在相同文件夾下如果有application.properties和application.yml兩個(gè)文件,那么application.properties文件會(huì)覆蓋application.yml文件,生效的是application.properties文件。
什么是yml文件
yml是由YAML (YAML Aint Markup Language)編寫的文件格式,是一種很直觀的數(shù)據(jù)序列化方式。很簡(jiǎn)單就是一種新的文件格式,和XML、prperties文件類似。
二、application.properties/.yml文件可以在其他路徑嗎
看到這個(gè)標(biāo)題的小伙伴肯定會(huì)說,難道application.properties可以在其他路徑,沒錯(cuò),猜對(duì)了。application.properties/.yml我們是放在了main/resources文件夾下,在項(xiàng)目運(yùn)行的時(shí)候該文件夾下的文件會(huì)被拷貝到classes文件夾下,所以該路徑又叫做classpath。
在springboot的源碼中搜索”application.properties“,搜到ConfigFileApplicationListener這樣一個(gè)類,在該類的注釋上有下面這段話,
* {@link EnvironmentPostProcessor} that configures the context environment by loading * properties from well known file locations. By default properties will be loaded from * 'application.properties' and/or 'application.yml' files in the following locations: * <ul> * <li>file:./config/</li> * <li>file:./config/{@literal *}/</li> * <li>file:./</li> * <li>classpath:config/</li> * <li>classpath:</li> * </ul>
大體意思是”EnvironmentPostProcessor通過從眾所周知的文件路徑加載properties來配置上下文環(huán)境。默認(rèn)的properties來自application.properties/application.yml文件,這些文件來自以下路徑“,
file:./config/ 根文件夾(項(xiàng)目文件夾)下的config目錄
file:./config/{@literal *}/ 根文件文件夾(項(xiàng)目文件夾)下的config/*/目錄
file:./ 根文件文件夾(項(xiàng)目文件夾)下
classpath:config/ classpath下的config/
classpath: classpath下
好了,我們已經(jīng)知道了application.properties/application.yml文件會(huì)從以上的幾個(gè)位置加載,且我們配置的main/resources其實(shí)就是上面的classpath:,那么上面的這些路徑是不是也有先后順序吶,順著ConfigFileApplicationListener這個(gè)類繼續(xù)往下看,看到了下面的這樣一個(gè)屬性,
// Note the order is from least to most specific (last one wins) private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/*/,file:./config/";
可以看到這個(gè)DEFAULT_SEARCH_LOCATIONS 指定的就是上面的幾個(gè)值,且上面的注釋很有意思,但是我沒翻譯好,通過例子來驗(yàn)證吧。已經(jīng)知道了application.properties和application.yml的優(yōu)先級(jí),我們就用application.properties文件來驗(yàn)證就好了,在resources/config(運(yùn)行路徑:classpath:/config/)下有application.properties,
看下現(xiàn)在使用的是哪個(gè)端口,
使用的是9092,也就說resouces/config的優(yōu)先級(jí)大于resources,即,classpath:/config/>classpath:/。下面再看下file:/
在項(xiàng)目的根路徑下新建了application.properties文件,起server.port為9093,下面看服務(wù)使用的哪個(gè)端口,
服務(wù)使用的是9093,優(yōu)先級(jí)為:file:/>classpath:/config/>classpath:/?,F(xiàn)在我在項(xiàng)目的路徑下增加config/my/路徑,且增加application.properties文件,
測(cè)試結(jié)果如下,
服務(wù)在端口”9094“啟動(dòng),說明優(yōu)先級(jí)為:file:./config/*/>file:./>classpath:/>classpath:/config/,最后一個(gè)驗(yàn)證的點(diǎn)為file:/config,這個(gè)我想無須驗(yàn)證了肯定優(yōu)先級(jí)是最高的,為此優(yōu)先級(jí)順序由高到低為:file:./config/ > file:./config/*/ > file:./ > classpath:/ > classpath:/config/,通俗點(diǎn)說就是:項(xiàng)目根路徑下的config>項(xiàng)目根路徑下的config/*/>項(xiàng)目根路徑>classpath:/config>classpath:/
三、總結(jié)
本文主要分析了springboot的默認(rèn)配置文件application.properties和application.yml的優(yōu)先級(jí),以及springboot默認(rèn)的加載路徑及每個(gè)路徑的優(yōu)先級(jí);
1、同級(jí)下,application.properties文件優(yōu)先級(jí)大于application.yml,前者會(huì)覆蓋后者;
2、springboot的默認(rèn)加載路徑有5個(gè),分別是classpath:/、classpath:/config/、項(xiàng)目根路徑、項(xiàng)目根路徑/config/*/、項(xiàng)目根路徑/config/,會(huì)從這5個(gè)路徑下加載application.properties或application.yml;
3、5個(gè)默認(rèn)的加載路徑的優(yōu)先級(jí)為:項(xiàng)目根路徑下的config > 項(xiàng)目根路徑下的config/*/ > 項(xiàng)目根路徑 > classpath:/config > classpath:/,前者會(huì)覆蓋后者
不知道小伙伴是否有這樣的疑惑,我們只能使用默認(rèn)的配置文件嗎?只能使用默認(rèn)的加載路徑嗎?當(dāng)然springboot不會(huì)這樣做,后面繼續(xù)揭曉,敬請(qǐng)期待。
到此這篇關(guān)于springboot默認(rèn)的5種加載路徑的文章就介紹到這了,更多相關(guān)springboot默認(rèn)加載路徑內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java通過cellstyle屬性設(shè)置Excel單元格常用樣式的全面總結(jié)講解
在處理Excel文件時(shí),經(jīng)常需要對(duì)單元格進(jìn)行樣式設(shè)置,以滿足特定的需求和美化要求,這篇文章主要給大家介紹了關(guān)于Java通過cellstyle屬性設(shè)置Excel單元格常用樣式的相關(guān)資料,需要的朋友可以參考下2024-01-01SpringBoot中如何進(jìn)行統(tǒng)一異常處理
大家好,本篇文章主要講的是SpringBoot中如何進(jìn)行統(tǒng)一異常處理,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02Java編程實(shí)現(xiàn)的二維數(shù)組轉(zhuǎn)置功能示例
這篇文章主要介紹了Java編程實(shí)現(xiàn)的二維數(shù)組轉(zhuǎn)置功能,結(jié)合實(shí)例形式分析了Java二維數(shù)組的遍歷、運(yùn)算、賦值等實(shí)現(xiàn)轉(zhuǎn)置的相關(guān)操作技巧,需要的朋友可以參考下2018-01-01詳解Spring中@Valid和@Validated注解用法
本文將以新增一個(gè)員工為功能切入點(diǎn),以常規(guī)寫法為背景,慢慢烘托出?@Valid?和?@Validated?注解用法詳解,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-07-07微服務(wù)mybatis typehandler使用詳解(就這一篇夠了)
TypeHandler是MyBatis框架的核心組件,實(shí)現(xiàn)數(shù)據(jù)庫表字段類型和Java 數(shù)據(jù)類型之間的相互轉(zhuǎn)換,本文介紹通過實(shí)例代碼mybatis typehandler使用,感興趣的朋友一起看看吧2024-02-02