Springboot加載配置文件

本文主要集中測試和探討一下 SpringBoot 的配置文件加載機制。java

一個簡單的SpringBoot工程,工程目錄結構以下:spring

實現功能:springboot

經過訪問 "/person" 這個接口,返回 PersonConfig 配置對象中的name和age屬性。bash

resource目錄下的 yml 文件配置以下:app

先將其打成 jar 包執行。maven

這裏要說一下給Springboot工程打jar包的方法。spring-boot

只須要簡單地,在pom文件中的build屬性添加下面的配置項便可,無需本身再添加 shade 或者 assembly 指定 mainClass 打包(關於這個實現機制,在後面的文章會集中探討。)。測試

<plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.1.4.RELEASE</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
複製代碼

執行命令,運行該 jar 包。ui

java -jar springboot-test-1.0-SNAPSHOT.jar
複製代碼

調用接口,查看返回結果。spa

這裏的運行咱們並無指定配置yml文件路徑。反編譯 jar 包後查看可知 yml 文件已經和全部的class文件一塊兒打包在jar包裏了。

可是在生產環境中,咱們每每須要的是實現可配置。這時候咱們可使用 springboot 提供的一個叫 Externalized Configuration 機制。

參考 springboot 官方文檔相關說明以下:

Spring Boot lets you externalize your configuration so that you can work with the same application code in different environments. You can use properties files, YAML files, environment variables, and command-line arguments to externalize configuration. Property values can be injected directly into your beans by using the @Value annotation, accessed through Spring’s Environment abstraction, or be bound to structured objects through @ConfigurationProperties.

這段話主要提到了 springboot 的四種配置機制:property 文件,yml 文件,環境變量,命令行。其實細看後面的說明,文檔中提到了 17 種配置方式,可是鑑於經常使用的的方式主要有這四種,因此如下就這四種機制進行探討。

YAML 文件配置方式

jar包同級的 yaml 文件

咱們在jar包同級目錄下放置 yml 配置文件,配置項以下所示:

經過命令行參數指定yml文件路徑,執行以下所示的命令:

java -jar springboot-test-1.0-SNAPSHOT.jar 
--spring.config.location=file:./application.yml
複製代碼

運行結果:

能夠看到jar包內yml文件中的屬性已經被覆蓋了。

若是此時不在命令行參數中指定結果會怎樣,程序會加載jar外的配置文件仍是jar包內部的?

執行下面的指令:

java -jar springboot-test-1.0-SNAPSHOT.jar
複製代碼

運行結果:

能夠看出來,結果與上面相同,即springboot會優先加載jar包外的 yml 文件,並提取其中參數配置項的值覆蓋 jar包內的 yml 文件。

若是咱們把jar外的yml文件刪除,會怎樣?

能夠看到,此時的值已經成爲jar包內配置的了。

可是,若是用命令行指定配置文件的路徑,那麼全部的配置文件路徑均可以麼?對此 springboot 是有規範的。

只有以上四種狀況。

下面咱們把 yml 文件放到一個叫 other 的文件夾下,並經過命令行參數指定文件路徑運行。

java -jar springboot-test-1.0-SNAPSHOT.jar  
--spring.config.location=file:./other/application.yml
複製代碼

此時的運行結果:

可知命令行指定的配置文件並無起做用。驗證了上面提到的四種路徑規範。

並且這些路徑之間的優先級以下:

1.file:./config/
2.file:./
3.classpath:/config/
4.classpath:/
複製代碼

springboot 掃描配置文件的順序從1到4。只要掃描到了配置文件,則再也不繼續掃描。

如今咱們在 config 目錄下和 jar 包同級根目錄下同時放置 yml 配置文件。

jar 包同級目錄下放置 yml 配置如上圖所示。執行命令:

java -jar springboot-test-1.0-SNAPSHOT.jar 
複製代碼

運行結果:

可知結果符合上面描述的優先級。
相關文章
相關標籤/搜索