ASP動態(tài)商業(yè)網(wǎng)站建設案例山西seo優(yōu)化公司
SpringBoot 配置文件修正和參數(shù)覆蓋
- SpringBoot 配置文件加載和參數(shù)覆蓋
- 1、SpringBoot 配置文件加載
- 1.1、修改application.properties的參數(shù)幾種方式
- 1.2、方法一:直接CMD
- 1.3、方法二:系統(tǒng)變量配置
- 1.4、方法三:程序運行配置
- 1.5、方法四:外部加載
- 2、SpringBoot 啟動參數(shù)覆蓋
- 2.1、不指定profile的加載順序
- 2.2、指定profile的加載順序
- 3、使用外部配置
- 3.1、擴展nacos開啟本地覆蓋遠程配置
- 外部參考
SpringBoot 配置文件加載和參數(shù)覆蓋
SpringBoot 或者SpringCloud 有配置文件加載和參數(shù)修改的機制,本文將從兩個角度闡述參數(shù)修改和配置文件啟動覆蓋問題。
1、SpringBoot 配置文件加載
以下幾種方式都可以被@Value讀取到
- java -jar -Dserver.port=8080 -Xms1024m demo.jar
- java -jar demo.jar --server.port=8080
- 從操作系統(tǒng)的環(huán)境變量中讀取
- 通過項目中配置文件bootstrap/application文件載入
1.1、修改application.properties的參數(shù)幾種方式
- 方法一:直接在cmd中執(zhí)行
- 方法二:系統(tǒng)變量配置
- 方法三:程序運行配置
- 方法四:外部加載
1.2、方法一:直接CMD
java -jar xxx.jar --server.port:8082
如果要修改多個參數(shù),空格后繼續(xù)寫就可以了。再例如:java -jar xxx.jar --server.port:8082 --test.name=xxx
1.3、方法二:系統(tǒng)變量配置
1.4、方法三:程序運行配置
1.5、方法四:外部加載
springboot 有讀取外部配置文件的方法,如下優(yōu)先級:
第一種是在jar包的同一目錄下建一個config文件夾,然后把配置文件放到這個文件夾下。
第二種是直接把配置文件放到jar包的同級目錄。
第三種在classpath下建一個config文件夾,然后把配置文件放進去。
第四種是在classpath下直接放配置文件。
我們通常在src/main/resources 文件夾下創(chuàng)建的application.properties 文件的優(yōu)先級是最低的!
1)內外都有配置文件,配置文件讀取是有優(yōu)先級,外配置文件優(yōu)于內配置文件讀取。
2)如果內配置文件里有外配置文件沒有的配置,那兩者互補。比如外配置文件沒有配置數(shù)據(jù)庫,內配置文件里配置了數(shù)據(jù)庫,那內配置文件的配置會被使用。
3)如果內配置文件里和外配置文件里都有相同的配置,比如兩者都配置了數(shù)據(jù)庫,但是兩個連接的不同,那外配置文件會覆蓋內配置文件里的配置。
2、SpringBoot 啟動參數(shù)覆蓋
2.1、不指定profile的加載順序
首先,在默認的情況下也就是不存在活動的profile(即不指定spring.profiles.active=?)時,四種文件的加載優(yōu)先級依次為bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml。
總結:bootstrap的配置先于application的配置加載,同時.properties的加載又先于.yml的加載,即加載優(yōu)先級bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml。
需要注意的是:
- 當同一個配置屬性在bootstrap.properties和bootstrap.yml文件中都存在時,那么properties中的配置會被加載,而忽略yml文件中的配置(即優(yōu)先級高的配置覆蓋優(yōu)先級低的配置),不同配置相互互補。此處application(.properties/yml)同理。
- 但當同一配置在bootstrap.properties和application.properties中都存在時,那么雖然優(yōu)先加載bootstrap.properties但是會被applicatioin.properties中的配置覆蓋,此時則變成了低優(yōu)先級覆蓋高優(yōu)先的配置,所以網(wǎng)上很多文章所說的高優(yōu)先級覆蓋低優(yōu)先級其實是不嚴謹?shù)摹?/li>
- 不同的配置會進行互補操作,即SpringBoot會讀取全部的配置文件,加載所有不同的配置項,匯成一個總的配置。
2.2、指定profile的加載順序
例如在指定了spring.profiles.active=dev/test/prod此類時,即指定profile時,加載優(yōu)先級便會發(fā)生變化此時活動的優(yōu)先級最高。
當指定dev時:
此時的加載優(yōu)先級變?yōu)榱薭ootstrap-dev.yml -> bootstrap.properties -> application-dev.yml ->application.properties。且同屬性配置的覆蓋問題和之前一樣,在同為bootstrap或同為application的情況下,優(yōu)先級高的覆蓋優(yōu)先級低的。但當同時存在bootstrap和application時后者仍會覆蓋前者中的配置。
**舉例1:**假如此時只有bootstrap-dev.yml 和bootstrap.properties且存在相同配置,則使用bootstrap-dev.yml中的配置,此時遵循高優(yōu)先級覆蓋低優(yōu)先級。
**舉例2:**假如此時有bootstrap-dev.yml 、bootstrap.properties及application.properties且存在相同配置,則使用application.properties中的配置,遵循application覆蓋bootstrap原則,同樣此時變成了低優(yōu)先級覆蓋高優(yōu)先級。
3、使用外部配置
如項目使用nacos做配置中心,則存在相同配置時以nacos中配置為主(在沒有開啟本地覆蓋nacos遠程配置的情況下),nacos中的配置將會覆蓋一切本地相同的配置,不同配置可以和本地進行互補。
3.1、擴展nacos開啟本地覆蓋遠程配置
如果需要啟動參數(shù)或者本地配置覆蓋遠程配置,那么需要在遠程配置里配置上允許重寫:
spring.cloud.config.allowOverride=true
但這是不夠的,盡管它開啟了總開關,但是還有兩個默認的小開關卡住了。
應同時添加如下配置:
spring.cloud.config.overrideNone=true
spring.cloud.config.overrideSystemProperties=false
第一個開關是遠端不覆蓋本地?true 是的不覆蓋。
第二個開關是遠端是否覆蓋系統(tǒng)配置?false 不覆蓋。 (默認為true 覆蓋)
請注意,第一個小開關包括第二個。
overrideNone = true的話會開啟所有包括本地配置和系統(tǒng)配置并忽略掉overrideSystemProperties配置。
如果只想開啟overrideSystemProperties,那么就是overrideNone = false,overrideSystemProperties=false。
外部參考
- springBoot項目配置文件加載優(yōu)先級及同配置覆蓋問題
- springboot 啟動修改application.properties中的參數(shù)的方法