Spring Boot下Profile的四種切換方式思路總結
Profile多環境下Profile
在實際專案釋出流程中,往往會涉及到多個環境下各類配置的切換。在Spring Boot中提供了多種機制允許開發者進行自行的定製和設定。
profile是用來描述某個環境下的配置資訊的總稱,包括:資料庫連線,配置資訊,名稱等等個性化的資訊。
基於Maven pom檔案的配置
profile設定
在以Maven管理的專案其核心流程與設定定在pom.xml檔案中,包括這裡提到的profile資訊。在maven的pom檔案中,可以定義多個profile,並設定預設的profile,在系統執行過程中,如果未指定profile,則使用預設的profiles。
其設定格式定義如下:
<project>
.......
<profiles>
<!-- MySQL Local Profile Setting -->
<profile>
<id>mysqldev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<appserver.port>8080</appserver.port>
<app.debug.mode>true</app.debug.mode>
<database.type>MySQL</database.type>
<database.username>test1</database.username>
<database.driver>com.mysql.jdbc.Driver</database.driver>
<database.password>12345678</database.password>
<!-- create=true -->
<database.url>jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8&&useSSL=false</database.url>
<!-- updatae -->
<database.ddl.action>update</database.ddl.action>
<database.dialect>org.hibernate.dialect.MySQL5Dialect</database.dialect>
<default.locale.info>zh_CN</default.locale.info>
</properties>
</profile>
<!-- Other Environment Setting -->
<profile>
<id>prod</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<properties>
<appserver.port>8080</appserver.port>
<app.debug.mode>true</app.debug.mode>
<database.type>MySQL</database.type>
<database.username>root</database.username>
<database.driver>com.mysql.jdbc.Driver</database.driver>
<database.password>123456</database.password>
<!-- create=true -->
<database.url>jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8&&useSSL=false</database.url>
<!-- updatae -->
<database.ddl.action>update</database.ddl.action>
<database.dialect>org.hibernate.dialect.MySQL5Dialect</database.dialect>
<default.locale.info>en_US</default.locale.info>
</properties>
</profile>
</profiles>
......
從上述設定中可以發現,activeByDefault用來設定預設profile。profiles節點中定義了多個profile,每個profile都表示一套環境的設定和配置資訊。
讀取配置資訊
基於@Value讀取配置資訊,示例如下:
@Component
@Data
public class ConfigBean {
@Value("${key.val1}")
private String keyVal;
}
第二種方式是基於配置檔案的讀取,在配置檔案中基於佔位符進行pom檔案中值的替換。
system-config.properties
key.val1=@pom.key.val1@
配置檔案實體類的讀取工具類:
@Data
@Configuration
@PropertySource(value={"classpath:systemconfig.properties"}, encoding="UTF-8")
public class SystemConfig {
@Value("${key.val1}")
private String keyVal;
}
在maven的命令列下進行profile的切換如下:
mvn clean package -P prod
-P profile_name: 指定profile的名稱
–spring.profiles.active=test: 指定活躍的profile name,此為Java命令列的引數
基於profile的properties配置檔案
在Spring Boot應用中,可以基於application.properties和application-{profile}.properties的方式來定義不同profile下的配置資訊。
假定目前有dev/prod/test三個profile,其中通用的配置資訊定義獨立定義在一個檔案中,個性化的配置資訊定義在各自獨立的配置檔案中:
- application.propeties: 定義各個執行環境統一的配置資訊
- application-dev.properties: 定義在dev中的各類配置檔案
- application-test.properties: 定義在test環境下的各類配置資訊
- application-prod.properties: 定義在prod環境下的各類配置資訊
載入的順序,優先載入application.properties檔案中的資訊,然後根據profile的定義,載入相應的配置檔案資訊,例如application-dev.properties配置檔案的資訊等。
這樣設計的好處就是通用的配置與個性化的配置資訊進行了隔離,在進行調整和修改之時,影響範圍變得可控和很小。
基於profile的yml配置檔案
yml是一種非常簡潔清晰的配置檔案格式,基於空格和層次遞進方式,扁平化顯示系統配置資訊。Spring Boot基於yml定義profile的各類資訊,定義格式如下:
spring:
profiles:
active: test
---
### Dev Setting
spring:
profiles: dev
server:
port: 8080
---
## Test Setting
spring:
profiles: test
server:
port: 8081
---
## Prod Setting
spring:
profiles: prod
server:
port: 8083
通過上述方式,可以簡潔地定義實現多個環境下的配置資訊定義。
基於多yml檔案的profile切換
此方式與property方式類似,都是將單個環境的配置資訊定義在獨立的yml檔案中,例如dev環境下的配置資訊將定義在application-{profile}.yml, profile實際為dev。
application.yml定義來通用的配置資訊,其中通過spring.profile.active定義當前active的profile名稱。
示例如下:
application.yml
spring:
profiles:
active: test
app:
title:
name: default name
application-dev.yml:
### Dev Setting
spring:
profiles: dev
server:
port: 8080
app:
title:
name: dev name
application-test.yml:
## Test Setting
spring:
profiles: test
server:
port: 8081
app:
title:
name: test name
application-prod.yml:
## Prod Setting
spring:
profiles: prod
server:
port: 8083
app:
title:
name: prod name
本身的結構與property方式非常類似。
總結
綜合而言,yml更為簡潔和層次分明,如果大家不熟悉的話,基於property檔案,也可以實現完全實現同樣的功能。
相關文章
- Spring Boot 整合 Shiro ,兩種方式全總結!Spring Boot
- Spring boot 讀取properties檔案的四種方式Spring Boot
- 從使用傳統Web框架到切換到Spring Boot後的總結Web框架Spring Boot
- Spring Boot更改上下文路徑的四種方式Spring Boot
- Spring Boot的五種部署方式Spring Boot
- Spring Boot開啟的2種方式Spring Boot
- Spring Boot + Vue 前後端分離,兩種檔案上傳方式總結Spring BootVue後端
- golang 中的四種型別轉換總結Golang型別
- Spring中bean的四種注入方式SpringBean
- 代理IP常見的三種切換方式
- Spring Boot - Profile不同環境配置Spring Boot
- Spring Boot中@Import三種使用方式!Spring BootImport
- javascript實現tab切換的四種方法JavaScript
- Spring Boot 專案鑑權的 4 種方式Spring Boot
- Spring Boot 讀取配置內容的三種方式Spring Boot
- Spring Boot讀取配置檔案的幾種方式Spring Boot
- Spring Boot第四彈,一文教你如何無感知切換日誌框架?Spring Boot框架
- Spring Boot入門(二):使用Profile實現多環境配置管理&獲取配置檔案值的兩種方式Spring Boot
- 四種博弈總結
- Python常用的四種數值交換方式!Python
- Spring Boot 配置檔案總結Spring Boot
- Spring Boot + JPA學習總結Spring Boot
- 基於Sql server資料庫的四種分頁方式總結SQLServer資料庫
- Spring Boot 實現定時任務的 4 種方式Spring Boot
- Spring Boot中初始化資源的幾種方式Spring Boot
- spring-boot-route(十)多資料來源切換Springboot
- Spring Boot中使用record四種簡化用法Spring Boot
- Spring Boot入門(四):開發Web Api介面常用註解總結Spring BootWebAPI
- 換一種方式編寫 Spring MVC 介面SpringMVC
- Spring boot常用命令總結Spring Boot
- Spring Boot+Mybatis專案總結Spring BootMyBatis
- spring-boot-route(一)Controller接收引數的幾種方式SpringbootController
- Spring Boot 中實現定時任務的兩種方式Spring Boot
- 你應該知道的幾種Spring boot非同步呼叫方式Spring Boot非同步
- Spring boot學習(四)Spring boot整合DruidSpring BootUI
- Spring Boot系列(四):Spring Boot原始碼解析Spring Boot原始碼
- Spring Boot 2.0(四):使用 Docker 部署 Spring BootSpring BootDocker
- Spring6 當中 獲取 Bean 的四種方式SpringBean