SpringBoot2.x基礎篇:配置文件的加載順序以及優先級覆蓋

前言

SpringBoot約定了配置文件,默認為 application.properties,通過該文件可以修改很多默認的配置,當然我們還可以在該配置文件內添加自定義的配置,該文件通過 key=value的形式進行配置。

作者 | 恆宇少年 - 於起宇

來源 | https://blog.yuqiyu.com/spring-boot-basic-load-order-of-config-files.html

1.疑惑配置提示?

當我們使用開發工具來配置時,就會出現相應的提示,這要完全要歸功於 spring-configuration-metadata.json配置元數據文件,該文件內記錄了配置的名稱類型歸屬類等信息,如果配置類型為 枚舉還可以實現 選擇性配置。

SpringBoot提供了一個依賴,它的主要任務就是自動生成配置元數據,該依賴的名稱為 spring-boot-configuration-processor,在打包時會在 META-INF目錄生成一個名為 spring-configuration-metadata.json的文件。


2.配置方式

雖然默認使用 properties格式的配置文件,不過這種方式會導致配置的部分前綴冗餘,可閱讀性稍差, SpringBoot內部還支持使用 yaml方式的配置文件,只需要在 src/main/resources目錄下創建一個名為 application.yml文件即可,使用配置時同樣也有提供功能。

項目內可以同時存在 application.properties、 application.yml兩個文件,經過測試發現, properties優先級會高一些,相同名稱的配置,會將 yml內的配置覆蓋掉。

3.指定配置文件

如果你的應用程序配置文件的名稱不是 application,你想要進行自定義,可以通過 --spring.config.name命令行參數進行指定,如下所示:

<code>java -jar project-sample.jar --spring.config.name=custome/<code>

注意事項:我們只需要指定配置文件的名稱即可,可以使用 properties或 yaml文件格式,上面的配置會加載 src/main/resources/custome.yml或 src/main/resources/custome.properties。

通過 --spring.config.name僅僅是修改了配置文件的名稱,那如果是修改配置文件所處的目錄位置,我們需要怎麼做呢?

SpringBoot已經給我們準備好了,通過 --spring.config.location參數就可以指定配置文件的位置,如下所示:

<code>java -jar project-sample.jar --spring.config.location=classpath:/configs/custome.yml/<code>

如果一個配置文件無法滿足你的需求,那你看看下面這個方式:

<code>java -jar project-sample.jar --spring.config.location=classpath:/configs/custome.yml,classpath:/configs/default.properties/<code>

注意事項:支持通過命令行參數的方式指定多個配置文件,使用英文半角 , 隔開即可。

如果你通過 spring.config.location指定的不是一個文件而是一個目錄,在路徑最後務必添加一個"/"結束,然後結合 spring.config.name進行組合配置文件,組合示例如下:

<code># 加載/configs/application.properties 或 /configs/application.yml(默認文件名)java -jar project-sample.jar --spring.config.location=classpath:/configs/# 加載/configs/custome.properties 或 /configs/custome.ymljava -jar project-sample.jar --spring.config.location=classpath:/configs/ --spring.config.name=custome/<code>

注意事項: spring.config.name該配置參數默認值為 application,所以如果只是指定了 spring.config.location併為目錄形式,上面示例中會自動將 spring.config.name追加到目錄路徑後,如果指定的 spring.config.location並非是一個目錄,這裡會忽略 spring.config.name的值。

4.加載順序

SpringBoot應用程序在啟動時會遵循下面的順序進行加載配置文件:

  1. 1. 類路徑下的配置文件
  2. 2. 類路徑內config子目錄的配置文件
  3. 3. 當前項目根目錄下的配置文件
  4. 4. 當前項目根目錄下config子目錄的配置文件

示例項目配置文件存放結構如下所示:

<code>. project-sample├── config│   ├── application.yml (4)│   └── src/main/resources|   │   ├── application.yml (1)|   │   └── config|   |   │   ├── application.yml (2)├── application.yml (3)/<code>

啟動時加載配置文件順序:1 > 2 > 3 > 4

src/main/resources下的配置文件在項目編譯時,會放在 target/classes下。

5.優先級覆蓋

SpringBoot配置文件存在一個特性,優先級較高的配置加載順序比較靠後, 相同名稱的配置 優先級較高的會 覆蓋掉 優先級較低的內容。

為了更好地解釋這一點,我們根據對應的加載順序分別創建一個 application.yml配置文件,來驗證根據優先級的不同是否存在覆蓋問題,如下圖所示:

SpringBoot2.x基礎篇:配置文件的加載順序以及優先級覆蓋

在上面四個配置文件中都有一個名為 name的配置,而紅色字體標註的內容就是每個配置文件 name的配置內容,下面我們來啟動項目測試下輸出內容。

6.運行測試

在測試之前我們讓啟動類實現 CommandLineRunner接口,如下所示:

<code>@SpringBootApplicationpublic class LoadOrderOfConfigFilesApplication implements CommandLineRunner {    public static void main(String[] args) {        SpringApplication.run(LoadOrderOfConfigFilesApplication.class, args);    }    @Value("${name}")    private String name;    @Override    public void run(String... args) throws Exception {        System.out.println("配置名稱:" + name);    }}/<code>

項目啟動後通過 run方法進行打印 ${name}配置的內容。

測試一:順序覆蓋

保留上面四個對應加載順序的配置文件,啟動項目,控制檯輸出內容:

<code>配置名稱:project/config/<code>

期望與實際輸出是符合的,項目根下的 config目錄是 最後加載的,所以它的 優先級相對其他三個來說是 最高的,覆蓋順序為:4 > 3 > 2 > 1

測試二:跨順序覆蓋

上一個測試點我們對每一個加載順序都對應添加了一個配置文件,那如果我們只有兩個 project/config、 classes/config兩個目錄的配置文件,是否按照優先級進行覆蓋呢?

刪除另外兩個,只保留 project/config、 classes/config兩個位置的配置文件,啟動項目控制檯輸出如下所示:

<code>配置名稱:project/config/<code>

同樣是輸出了優先級最高的 project/config配置文件的內容,覆蓋順序為:4 > 1

測試三:單順序加載

平時在項目開發中一般都是將 application.yml配置文件放在 src/main/resources目錄下,然而根據上面的加載順序來看,我們可以將配置文件放置在任意一處,啟動時都會進行加載。

僅保留 classes/config位置的配置文件,啟動項目控制檯輸出內容如下所示:

<code>配置名稱:classes/config/<code>

IDEA對 SpringBoot的支持真的很強大, classes/config下的配置文件同樣提供了 關鍵字提醒功能。

7.總結

瞭解配置文件的加載順序,才能得心應手的進行配置覆蓋,完全控制在不同環境下使用不同的配置內容,要記住 classes/application.yml優先級最低, project/config/application.yml優先級最高。




分享到:


相關文章: