上次分享瞭如何一步一步搭建一個springboot的項目,詳細參見《5分鐘快速搭建一個springboot的項目》,最終的結果是在”8080“端口搭建起了服務,併成功訪問。不知道有小夥伴是否有疑惑,springboot應該有配置文件的,一般的配置文件都是application.properties或者application.yml,的確是這樣的。但是我確實沒有這些配置文件,服務正常在”8080“端口啓動,這是因爲在springboot內部有一套默認的機制。今天不聊這些默認的機制,聊一聊application.properties/application.yml文件。
一、application.properties/.yml文件初識
前面說到沒有配置application.properties文件,現在我在main/resources文件夾下新建一個application.properties文件,並且寫上如下的配置
然後,啓動項目,
好了,通過上面的啓動結果截圖,看到服務在端口”9090“啓動了。那麼如果在該目錄下在配置一個application.yml文件吶,
啓動結果如下,
可以看到依然是在端口”9090“啓動服務。爲此得出這樣個結論:在相同文件夾下如果有application.properties和application.yml兩個文件,那麼application.properties文件會覆蓋application.yml文件,生效的是application.properties文件。
什麼是yml文件
yml是由YAML (YAML Aint Markup Language)編寫的文件格式,是一種很直觀的數據序列化方式。很簡單就是一種新的文件格式,和XML、prperties文件類似。
二、application.properties/.yml文件可以在其他路徑嗎
看到這個標題的小夥伴肯定會說,難道application.properties可以在其他路徑,沒錯,猜對了。application.properties/.yml我們是放在了main/resources文件夾下,在項目運行的時候該文件夾下的文件會被拷貝到classes文件夾下,所以該路徑又叫做classpath。
在springboot的源碼中搜索”application.properties“,搜到ConfigFileApplicationListener這樣一個類,在該類的註釋上有下面這段話,
* {@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來配置上下文環境。默認的properties來自application.properties/application.yml文件,這些文件來自以下路徑“,
file:./config/ 根文件夾(項目文件夾)下的config目錄
file:./config/{@literal *}/ 根文件文件夾(項目文件夾)下的config/*/目錄
file:./ 根文件文件夾(項目文件夾)下
classpath:config/ classpath下的config/
classpath: classpath下
好了,我們已經知道了application.properties/application.yml文件會從以上的幾個位置加載,且我們配置的main/resources其實就是上面的classpath:,那麼上面的這些路徑是不是也有先後順序吶,順着ConfigFileApplicationListener這個類繼續往下看,看到了下面的這樣一個屬性,
// 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/";
可以看到這個DEFAULT_SEARCH_LOCATIONS 指定的就是上面的幾個值,且上面的註釋很有意思,但是我沒翻譯好,通過例子來驗證吧。已經知道了application.properties和application.yml的優先級,我們就用application.properties文件來驗證就好了,在resources/config(運行路徑:classpath:/config/)下有application.properties,
看下現在使用的是哪個端口,
使用的是9092,也就說resouces/config的優先級大於resources,即,classpath:/config/>classpath:/。下面再看下file:/
在項目的根路徑下新建了application.properties文件,起server.port爲9093,下面看服務使用的哪個端口,
服務使用的是9093,優先級爲:file:/>classpath:/config/>classpath:/。現在我在項目的路徑下增加config/my/路徑,且增加application.properties文件,
測試結果如下,
服務在端口”9094“啓動,說明優先級爲:file:./config/*/>file:./>classpath:/>classpath:/config/,最後一個驗證的點爲file:/config,這個我想無須驗證了肯定優先級是最高的,爲此優先級順序由高到低爲:file:./config/ > file:./config/*/ > file:./ > classpath:/ > classpath:/config/,通俗點說就是:項目根路徑下的config>項目根路徑下的config/*/>項目根路徑>classpath:/config>classpath:/
三、總結
本文主要分析了springboot的默認配置文件application.properties和application.yml的優先級,以及springboot默認的加載路徑及每個路徑的優先級;
1、同級下,application.properties文件優先級大於application.yml,前者會覆蓋後者;
2、springboot的默認加載路徑有5個,分別是classpath:/、classpath:/config/、項目根路徑、項目根路徑/config/*/、項目根路徑/config/,會從這5個路徑下加載application.properties或application.yml;
3、5個默認的加載路徑的優先級爲:項目根路徑下的config > 項目根路徑下的config/*/ > 項目根路徑 > classpath:/config > classpath:/,前者會覆蓋後者
不知道小夥伴是否有這樣的疑惑,我們只能使用默認的配置文件嗎?只能使用默認的加載路徑嗎?當然springboot不會這樣做,後面繼續揭曉,敬請期待。
推薦閱讀