spring.profiles.active和spring.profiles.include的區別與使用
- 業務場景
- 優化方式
- spring.profiles.active屬性
- 啟動時指定:
- spring.profiles.include屬性
- 配置方法:
- 配置的位置和區別:
- 用示例來使用和區分
- 測試一:
- 測試二:
- 測試三:
業務場景
一套程序可能會被部署到不同的環境。開發、測試、生產環境有不同的配置信息,包括jdbc地址、ip、端口等。如果在同一個配置文件中,每次部署去改配置,會非常麻煩且容易出錯。
優化方式
spring.profiles.active屬性
一個好方法就是創建不同的配置文件,且命名規則遵循application-${profile}.properties,例如:
- 開發環境配置文件:application-dev.properties
- 測試環境配置文件:application-test.properties
- 生產環境配置文件:application-prod.properties
當然,我們不能刪除項目最頂層的application.properties配置,在該文件中,根據部署場景不同,切換不同的配置文件:配置spring.profiles.active,屬性值為${profile}。
- spring.profiles.active=dev:啟用application-dev.properties
- spring.profiles.active=test:啟用application-test.properties
- spring.profiles.active=prod:啟用application-prod.properties
啟動時指定:
在執行有參啟動時,可以在命令中進行指定要選用的配置文件,例如:
java -jar xx.jar --spring.profiles.active=test
這個命令的優先級是最高的,即使application.properties中已經配置spring.profiles.active=dev,最終程序還是會用application-test.properties配置文件。
spring.profiles.include屬性
再進一步,對於開發環境,想用不同的配置文件存儲開發環境不同的配置,例如:
application-dev1.properties中存儲jdbc信息
application-dev2.properties中存儲ip、端口信息
即在啟用application-dev.properties開發環境(主)配置文件時,同時啟用application-dev1.properties和application-dev2.propertie。
那么,可以使用spring.profiles.include屬性:同時啟用其他的profile
配置方法:
- 若是properties文件:spring.profiles.include=dev1,dev2
- 若是yaml文件中,
spring.profiles.include:
-dev1
-dev2
或者:spring.profiles.include:dev1,dev2
配置的位置和區別:
- 配置方式一:application.properties中,配置spring.profiles.active=dev的同時指定spring.profiles.include=dev1,dev2
- 配置方式二:application.properties中,配置spring.profiles.active=dev,application-dev.properties中,配置spring.profiles.include=dev1,dev2。使用application-dev.properties時自動就激活了dev1、dev2兩個文件,不用再次指定。(個人認為第二種方法更好)
區別:
- 第一種方式啟動時,控制台打印The following profiles are active:dev1,dev2,dev
- 第二種方式啟動時,控制台打印The following profiles are active:dev, dev1,dev2
按照順序,后面的覆蓋前面的。
用示例來使用和區分
在某個工程里,我依據開發、生產環境,以及它們要同時激活的配置,創建了多個配置,分別如下:
application-dev.properties配置:
my.name=dev my.height=170 #同時觸發dev1和dev2的激活 spring.profiles.include=dev1,dev2
application-dev1.properties配置:
my.name=dev1 my.height=171
application-dev2.properties配置:
my.name=dev2 #my.height=172
application-prod.properties配置:
my.name=prod my.height=180
application-prod1.properties配置:
my.name=prod1 my.height=181
application-prod2.properties配置:
my.name=prod2 my.height=182
測試一:
在application.properties配置文件中,指定
#激活的是開發環境配置文件
spring.profiles.active=dev
啟動時不指定參數
結果:打印的內容為:姓名:dev2,身高:171
原因:
- 先加載application.properties
- 再加載application-dev.properties,
my.name=dev
my.height=170 - 加載application-dev1.properties,
my.name=dev1
my.height=171 - 加載application-dev2.properties,
my.name=dev2
my.height=171
測試二:
在測試一的基礎上,啟動時指定參數:–spring.profiles.active=prod
優先級最高,會使用生產環境配置文件
結果:打印的內容為:姓名:prod,身高:180
測試三:
在application.properties配置文件中,指定
#激活的是生產環境配置文件
spring.profiles.active=prod #同時觸發prod1和prod2的激活 spring.profiles.include=prod1
啟動時不指定參數
結果:
The following profiles are active: prod1,prod2,prod
打印的內容為:姓名:prod,身高:180