SpringBoot配置文件的加載位置

SpringBoot啓動會掃描如下位置的application.yml或者 application.properties文件做爲SpringBoot的默認配置文件。html

-file:./config/   java

-file:./spring

-classpath:/config/瀏覽器

-classpath:/tomcat

即根目錄下的config目錄下,而後是 根目錄下,而後是classpath路徑下的config目錄下,最後是classpath路徑下。app

優先級由高到低,高優先級的配置會覆蓋低優先級的配置。dom

eg.假如:根目錄下的config目錄下定義端口爲8084,  根目錄下定義端口爲8083 ,classpath路徑下的config目錄定義端口爲8082,classpath路徑下定義端口爲8081,最後啓動,啓動的端口爲8084 ,高優先級會覆蓋低優先級。spring-boot

注意: 並非高優先級的被加載了,低優先級的就不會再加載,其實是SpringBoot會從這四個位置所有加載主配置文件,而且還能產生互相配置的效果。spa

例如:  其它三個位置的主配置文件僅僅定義了端口,在最低優先級的classpath路徑下的配置文件中配置項目訪問路徑,以下:操作系統

定義一個簡單的Controller ,用來測出訪問路徑。

 

請看:訪問路徑變爲 :

除此外,咱們還能夠經過spring.config.location來改變默認的配置文件位置。

項目打包好之後,咱們可使用命令行參數的形式,啓動項目的時候來指定配置文件的新位置;指定默認加載的這些配置文件共同起做用造成互補配置。

eg : 在 G盤目錄下,建立一個application.properties文件(yml也能夠),定義端口爲8085 

打包項目,啓動命令行:java -jar  spring-boot-02-config-02.0.0.1-SNAPSHOT.jar  --spring.config.location=G:/application.properties     回車運行。

瀏覽器訪問: http:localhost:8005/boot02/hello  ,顯然外部指定的配置文件生效了,而且與以前的主配置文件造成了互補配置

 

外部配置加載順序

SpringBoot也能夠從如下位置加載配置,優先級從高到低,高優先級的配置覆蓋低優先級的配置,全部的配置造成互補配置。

 1. 命令行參數

     eg:   java -jar  spring-boot-02-config-02.0.0.1-SNAPSHOT.jar --server.port=8087

 2. 來自java:comp/env的NDI屬性

 3. Java系統屬性(System.getProperties() )

 4. 操做系統環境變量

 5. RandomValuePropertySource配置的random.*屬性值

 ---- 由jar包外向jar包內進行尋找:

   優先加載帶profile

 6. jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置文件

    將打好的jar包放在一個目錄下,好比叫作 hello的文件夾,而後再該文件夾下新建一個名爲application.yml的文件,其中指定

  port爲8088 ,訪問路徑爲/boot ,而後命令行直接啓動項目。java  -jar spring-boot-02-config-02.0.0.1-SNAPSHOT.jar

瀏覽器經過  localhost:8088/boot/hello 能夠正常訪問,表示同級目錄下的配置文件生效了。

訪問狀況以下:

 7. jar包內部的application-{profile}.properties或application.yml(帶spring.profile)配置文件

 8. jar包外部的application.properties或application.yml(不帶spring.profile)配置文件

8. jar包外部的application.properties或application.yml(不帶spring.profile)配置文件

 9. jar包內部的application.properties或application.yml(不帶spring.profile)配置文件

 10. @Configuration註解類上的propertySource

 11. 經過SpringApplication.setDefaultProperties指定的默認屬性。

全部支持的配置加載來源:

參考官方文檔   SpringBoot外部配置

寫在最後:

 當同一個目錄下同時存在properties和yml文件時,會優先加載properties文件裏的內容,兩個文件中的內容會進行互補操做,即SpringBoot會讀取兩份文件中的全部內容,會加載全部不一樣的配置項,匯成一個總的配置,若是同一個配置兩個文件中都存在,那麼properties中的配置會被加載,而忽略yml文件中的配置。

eg: 在springBoot的resources目錄下同時存在application.properties和application.yml,而且文件內容分別以下:

server.port=8084
server.tomcat.max-threads=100
server:
  port: 8085
  tomcat:
    max-connections: 50000

那麼,最終的配置是 端口爲8084 ,而且tomcat配置了max-threads,值爲100 ,max-connections,值爲500