SpringBoot內外部配置文件加載和優先級

一、簡介

前言:

Spring這麼流星很重要的一個思想是:配置化思想。從而達到解耦的目的,很多都不需要硬編碼,配置一下即可完成,可謂大大提高了編碼的效率。

Spring支持的配置文件加載的方式繁多,一方面是擴大了靈活性,另一方面其實也帶來了較大的複雜性。因此本文旨在用一篇文章解決讀者朋友的煩惱,同時有時候也是你我的煩惱。

我們知道SpringBoot支持三種配置文件:

application*.yml  
application*.yaml   
application*.properties 

示例:

在 Resources 文件夾下新建 application.yml 和 application.properties 文件。

application.properties:

server.port=8001

application.yml :

server:
  port: 7001

運行程序:

通過運行結果,我們可以得出:

這三種配置文件以 application*.properties 優先級最高application.properties 和 yml 文件在並存時(同一目錄下)

application.properties 優先級更好,會先讀它,若它沒有,再去讀yml中的值。

下面所有的Demo代碼都以 yml 進行演示 

二、內部的配置文件加載

 內部配置文件的加載都有哪些目錄呢?

我們在IDE編輯器中找到類 ConfigFileApplicationListener 打開,發現默認掃描目錄是四個:

 對應的四個目錄:

path   掃描優先級
 ./  項目根目錄下的config目錄 2
 ./config 項目根目錄下的config目錄  1
 classPath:./ 編譯路徑下的根目錄  4
 classPath:/config 編譯路徑下的config目錄  3

 

 

 

 

項目啓動後掃描順序:

    1. 先去項目根目錄找config文件夾下找配置文件件
    2. 再去根目錄下找配置文件
    3. resources下找cofnig文件夾下找配置文件
    4. resources下找配置文件

 以上四個目錄,SpringBoot 啓動時會按照優先級從低到高的順序,所有的配置文件都會被加載,高優先級的配置文件會覆蓋低優先級的配置文件內容。

SpringBoot 會按照四個位置全部加載配置文件,如果高優先級的配置文件屬性和低優先級的配置文件屬性不衝突,則會共存互補。  

按照上面的目錄,我們在項目中分別建立對應的文件夾和文件夾下的文件,配置文件的優先級爲:

備註:

這裏說的配置文件,都還是項目裏面。最終都會被打進jar包裏面的,需要注意。

1、如果同一個目錄下,有 application.yml 也有 application.properties,默認先讀取 application.properties。
2、如果同一個配置屬性,在多個配置文件都配置了,默認使用第1個讀取到的,後面讀取的不覆蓋前面讀取到的。
3、創建SpringBoot項目時,一般的配置文件放置在“項目的resources目錄下”

 

三、外部的配置文件加載

有的時候,配置信息是我們無法在開發過程中就能確定的。比如,給客戶開發的項目,客戶需要根據自身的情況自定義配置,如數據庫配置,加密密鑰配置等等。

這時候,就需要把配置文件放在外面,讓用戶自定義配置部署了。

SpringBoot  打包時不會把 ./config  ./這兩級的目錄打包進去。這個設計很巧妙,因爲沒有打包進來,所以SpringBoot可以加載外部發配置文件。

SpringBoot 支持把配置文件放在外部。只要把配置文件放在jar包的同級目錄下,或者放在同級下的config文件夾中,SpringBoot都會去此處讀取配置文件。

1、現在有一個SpringBoot 打包程序,(有一個配置文件 application.yml 在默認的 Resources 文件夾下):

 application.yml 配置信息:

server:
  port: 8001

執行命令  java -jar springboot-0.0.1-SNAPSHOT.jar  ,程序啓動以後,我們可以看到啓動端口是我們配置的 8001:

 2、這時,我們在根目錄添加配置文件 application.properties

server.port=8002

執行命令  java -jar springboot-0.0.1-SNAPSHOT.jar  ,程序啓動後,啓動端口爲 application.properties 配置文件內配置的 8002 端口

3、這時,我們在根目錄添加文件夾和配置文件 ./config/application.properties

server.port=8003

執行命令  java -jar springboot-0.0.1-SNAPSHOT.jar  ,程序啓動後,我們發現啓動端口爲根目錄 config文件夾下 application.properties 配置文件內配置的 8003 端口

 

 這樣每次修改的時候只需要修改配置文件信息,然後重啓項目就好,不需要重新打包。如果想要只修改配置文件,不重啓項目就能生效,可以考慮用java來讀取配置文件中的數據。

四、命令行配置方式

比如  java -jar 這種方式,多個屬性之間用空格分開,properties 裏的屬性基本都能用,用法是屬性項=屬性值這種方法,舉個例子:

java -jar springboot-0.0.1-SNAPSHOT.jar --server.port=8002 --server.context-path=/example

上面的命令行進行了兩個配置  server.port 和 server.context-path。可以根據需要進行配置。

如果我們外部的配置文件不想放在默認的位置可使用 --spring.config.location 命令指定配置文件的目錄

在根目錄新建 test 文件夾,把 application.properties 配置文件放入其中:

test文件夾內  application.properties 配置文件內容:

server.port=8006

執行 下面命令行,啓動項目:

java -jar springboot-0.0.1-SNAPSHOT.jar --spring.config.location=./test/application.properties

項目啓動後,可以看到端口後是 test 文件夾中 application.properties 配置文件中配置的端口,配置生效。

 

原文地址:

https://www.cnblogs.com/wwj1992/articles/12569164.html

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章