springboot 外部配置文件spring.config.location 為什么不生效?


一、背景

原文鏈接 https://blog.csdn.net/trayvonnn/article/details/106239934 僅作分享,感謝作者
本文寫的是單應用下的springboot,並非微服務,如果是微服務可以參考nocos或者springcloud config。

一般在企業開發流水線中,都會涉及到幾個環境的發布,dev開發環境,test測試環境,prod生產環境等等,那么如果需要發布一個項目到不同的環境會有幾種方式:(個人拙見)

第一,可以通過maven打包的方式指定特定環境的配置,這種方式就需要在打包的時候對環境做出區分,對於一些企業可能打包的工具是不區分環境的。
第二,也可以通過springboot運行時指定配置文件的環境,這樣的話配置文件可能需要被管理在項目中,那么無法很好保護生產環境的配置。
第三,也可以通過環境變量的方式,區分不同環境的配置,這種方式缺點是要維護一份環境變量的文件,沒有配置文件來的簡便,不過也是一種方式。
最后就是就特定環境的配置放在服務器特定目錄下,通過項目引用外部的配置文件來區分環境。
現在就按第四種展開。先了解springboot的默認加載方式。

二、springboot 默認的配置文件加載順序

24.3 Application property files
SpringApplication will load properties from application.properties files in the following locations and add them to the Spring Environment:

A /config subdirectory of the current directory.
The current directory
A classpath /config package
The classpath root
The list is ordered by precedence (properties defined in locations higher in the list override those defined in lower locations).

這里說了四種方式可以把配置文件放到外部的。

第一種是在jar包的同一目錄下建一個config文件夾,然后把配置文件放到這個文件夾下;
第二種是直接把配置文件放到jar包的同級目錄;
第三種在classpath下建一個config文件夾,然后把配置文件放進去;
第四種是在classpath下直接放配置文件。
這里的優先級也是依次降低,優先級高的覆蓋優先級低的,可以注意點的是,只是對相同配置項才會產生覆蓋作用,不同的話是互補作用,也就是說如果四個地方都配了的話,是會累加起來的。
另外,如果我們需要自定義配置文件路徑的話,可以通過命令行啟動程序時配置 --spring.config.location=xxx.properties就可以達到目的,但是對運維就不太優化,因為在啟動命令時候要配置好這個特定項目路徑。那么如果通過一個配置項spring.config.location來實現配置。

三、spring.config.location為什么沒有生效

原因是在application配置文件里面指定spring.config.location的優先級太低了,加載太遲了,導致加載不到特定的配置文件,因此在通過命令行啟動的方式可以提高優先級,加載到配置文件。

四、通過spring.cloud的方式

spring cloud中 通過bootstrap.yml/properties來加載配置中心的配置。那么bootstrap/ application 的區別?

Spring Cloud 構建於 Spring Boot 之上,在 Spring Boot 中有兩種上下文,一種是 bootstrap, 另外一種是 application, bootstrap 是應用程序的父上下文,也就是說 bootstrap 加載優先於 applicaton。bootstrap 主要用於從額外的資源來加載配置信息,還可以在本地外部配置文件中解密屬性。這兩個上下文共用一個環境,它是任何Spring應用程序的外部屬性的來源。bootstrap 里面的屬性會優先加載,它們默認也不能被本地相同配置覆蓋

因此,對比 application 配置文件,bootstrap 配置文件具有以下幾個特性。

boostrap 由父 ApplicationContext 加載,比 applicaton 優先加載
boostrap 里面的屬性不能被覆蓋
好了 最后通過引用組件:Spring Cloud Context,bootstrap文件才能生效。

<!--需要引入該jar才能使bootstrap配置文件生效--> 
<dependency> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-context</artifactId> 
</dependency>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM