SpringBoot 簡明教程之項目屬性配置(三):配置優先級及多環境切換
在實際的項目開發中,一個項目從開發到上線的過程中會有多個配置環境,比如:
開發環境 -> 測試環境 -> 生產環境
所以,如果我們忘記修改了,那就是個傷腦經的問題。幸好,Spring Boot依靠其優先級配置讀取的機制來幫助我們從這種困境中走出來。
配置文件優先級
位置優先級
Springboot 啓動會掃描以下位置的application.yml文件作爲Spring boot的默認配置文件
–file:./config/
–file:./
–classpath:/config/
–classpath:/
例如:
首先,我們在【classpath:/】路徑下將端口配置爲:8080,我們啓動Spring Boot項目:
此時,啓動的端口是:8080.
接着,我們再在【classpath:/】下創建【config/】文件,並將端口配置爲:8081,啓動項目:
我們發現,即使【classpath:/】下的application.yml未註銷的情況下,啓動端口依然變成了:8081。
接着,我們再在【file:./】下配置端口爲:8082,啓動項目:
接着,我們再在【file:./】下創建【config/】文件,並將端口配置爲:8083,啓動項目:
經過測試,我們發現這四個位置的配置文件都是可以在Springboot 啓動時被讀取的,優先級存在以下關係:file:./config/ > file:./ > classpath:/config/ > classpath:/。
然後我們在【classpath:/】下的配置文件中配置訪問路徑爲:/test , 啓動項目:
我們發現,除了項目雖然採用了最高優先級的啓動端口,但是同時因爲最高優先級沒有設置啓動的路由,所以Spring Boot依然讀取了低優先級的配置,所以,Spring Boot採用的是一種互補配置,即:最高優先級會覆蓋低優先級的配置,但是同時也會讀取低優先級中,在高優先級所沒有的配置信息。
更改默認的配置文件位置
我們可以使用【–spring.config.location=】來更改已經打成Jar包的配置文件。
首先,我們將複製一份application.yml文件到項目目錄外(我選擇放在D盤下),並將配置文件中的啓動端口更改爲:8085。
然後我們將項目打成Jar包:
然後進入控制檯:
執行命令行:
java -jar springboot-04-0.0.1-SNAPSHOT.jar --spring.config.location=D:\application.yml
然後我們就發現,啓動的端口變成了:8085端口。
但是需要注意的是:項目打包好以後,我們可以使用命令行參數的形式,啓動項目的時候來指定配置文件的新位置,但是指定的配置文件和默認加載的這些配置文件依然是共同起作用形成互補配置;
總結
配置文件具有優先級,高優先級的配置會覆蓋低優先級的配置,且SpringBoot會從這四個位置全部加載主配置文件形成互補配置;同時,我們還可以通過spring.config.location命令來改變默認的配置文件位置。但同時需要注意的是:我們項目在打包成Jar包的過程中,【file:./config/】、【–file:./】下的配置文件是不會被打包的,例如,我們直接運行上面打包好的Jar包,我們發現運行的端口爲:8081,
所以,我們就需要了解下面的外部配置文件加載。
外部配置文件加載
SpringBoot官方給出了17種加載的方式,有興趣的小夥伴可以自行參考:官方文檔
我們演示一下其中幾個:
1.命令行參數
例如,我們通過命令行指定Jar包的啓動端口爲:8086,
我們發現,啓動端口就已經被更改爲:8086了。
2.Jar包外部的配置文件
加入當我們需要修改多個配置信息時,我們就可以編寫一個新的配置文件上傳,例如:我們創建一個新的文件夾【test】,並將Jar吧和將啓動端口更改爲:8087的配置文件放在裏面:
然後,我們運行
我們就發現啓動端口已經被更改。
總結
我們對於更改一些比較少的配置信息,我們可以通過命令行的形式實現,但是如果我們更改的內容比較多,我們就可以通過編寫新的配置文件的方式實現,其中:配置文件由jar包外向jar包內進行尋找,即:jar包外的配置文件優先級高於jar包內的。
多環境切換
我們在進行多環境文件配置時,我們可以使用: application-{profile}.yml的方式進行命名,例如:
然後,我們在三個配置中,分別設置爲:
application.yml
server:
port: 8083
application-dev.yml
server:
port: 8084
application-prod.yml
server:
port: 8085
然後,我們重新啓動項目:
我們發現端口依然是:8083,那麼證明:Spring Boot**默認使用application.properties的配置**;
那麼,我們如何將使用其他配置呢?
我們將application.yml修改爲:
server:
port: 8083
spring:
profiles:
active: dev
然後,我們再次啓動項目:
發現,端口就已經變成了:application-dev.yml文件中的內容,同理,如果我們將【active】的值賦爲【prod】,那麼就將使用application-prod.yml中的配置文件,這裏我們就不再演示。
或許,你會得寫這麼多的配置文件會不會有點麻煩呢?那麼YAML的優勢就顯示出來了,我們可以使用YAML文件的文檔塊來進行配置:(先將application-dev.yml、application-prod.yml文件中的內容進行註釋)
application.yml
server:
port: 8083
spring:
profiles:
active: prod
---
server:
port: 8084
spring:
profiles: dev #指定屬於哪個配置文件
---
server:
port: 8085
spring:
profiles: prod
我們再重新啓動項目:
啓動的端口就已經變成了:8085。
除此之外,我們還可以通過指定命令行的方式指定配置文件,命令爲:
spring.profiles.active=dev
這裏就不再演示。
源碼地址
總結:
Spring Boot中的配置文是具有優先級制度的,總體上是:高優先級將覆蓋低優先級的配置,同時進行互補配置。對於Jar包來說,jar包外的優先級高於Jar包內的,帶有spring.profiles的高於不帶的。