Spring注解@Profile實(shí)現(xiàn)開發(fā)環(huán)境/測試環(huán)境/生產(chǎn)環(huán)境的切換
前言
在進(jìn)行軟件開發(fā)過程中,一般會(huì)將項(xiàng)目分為開發(fā)環(huán)境,測試環(huán)境,生產(chǎn)環(huán)境,開發(fā)人員在開發(fā)環(huán)境進(jìn)行開發(fā),然后將代碼合并到測試環(huán)境讓 測試工程師進(jìn)行測試,測試完成后,開發(fā)人員修改完bug,然后再進(jìn)行測試,測試工程師測試沒有bug后,再將代碼合并到生產(chǎn)環(huán)境,生產(chǎn)環(huán)境 就是最終給用戶用的,現(xiàn)在的項(xiàng)目一般都是走CI/CD流水線,整個(gè)過程就是一條流水線,而在沒有CI/CD之前,開發(fā)人員開發(fā)完畢后,可能需要將代碼 部署上服務(wù)器,測試人員再進(jìn)行測試,還有的直接讓測試人員拉代碼來自己運(yùn)行,自己測試,這樣效率實(shí)在是太低了。那么在這么多環(huán)境之間進(jìn)行切換, 我們應(yīng)該需要一定的策略,下面我就是用Spring的@Profile注解來實(shí)現(xiàn)環(huán)境之間的切換。
環(huán)境搭建
項(xiàng)目結(jié)構(gòu)
DruidDataSource
└── src
└── main
└── java
└── com.steakliu.druiddatasource
├── controller
│ └── DataSourceController.java
└── datasource
│ └── DataSourceConfiguration.java
└── DruidDataSourceApplication.java
└── resource
└── application.yml
└── application-dev.yml
└── application-prod.yml
└── application-test.yml
application.yml
application.yml內(nèi)容如下,里面主要放的是公共的配置,比如項(xiàng)目的名稱啊,端口啊這些,使用spring.profiles.active = dev/test/prod切換不同的環(huán)境。
server:
port: 8080
spring:
profiles:
active: devapplication-dev.yml
spring:
datasource:
druid:
username: root
password: xiaosi520@
url: jdbc:mysql://127.0.0.1:3306/store-dev
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
application-test.yml
spring:
datasource:
druid:
username: root
password: xiaosi520@
url: jdbc:mysql://127.0.0.1:3306/store-test
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
application-prod.yml
spring:
datasource:
druid:
username: root
password: xiaosi520@
url: jdbc:mysql://127.0.0.1:3306/store-prod
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
從上面我們知道,三個(gè)yaml文件主要配置的是數(shù)據(jù)庫,分為dev,test,prod三個(gè)庫,我也在數(shù)據(jù)庫創(chuàng)建了三個(gè)數(shù)據(jù),等一下我們要根據(jù)不同的配置獲取不同的數(shù)據(jù)庫的數(shù)據(jù), 三個(gè)數(shù)據(jù)庫如下,其中每個(gè)庫里面都有一張表,分別放了一條測試數(shù)據(jù)。

數(shù)據(jù)源配置DataSourceConfiguration
DataSourceConfiguration是一個(gè)數(shù)據(jù)源配置類,我們使用alibaba的Druid數(shù)據(jù)源,使用@Value注解來獲取yaml文件的數(shù)據(jù)庫配置, 定義了三個(gè)Bean,并使用@Profile來進(jìn)行開發(fā)環(huán)境,測試環(huán)境,生產(chǎn)環(huán)境的區(qū)分,這里它會(huì)識(shí)別application.yml文件中的spring.profiles.active
package com.steakliu.druiddatasource.datasource;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import javax.sql.DataSource;
@Configuration
public class DataSourceConfiguration {
@Value("${spring.datasource.druid.username}")
private String username;
@Value("${spring.datasource.druid.password}")
private String password;
@Value("${spring.datasource.druid.url}")
private String url;
@Value("${spring.datasource.druid.driver-class-name}")
private String driverClassName;
@Profile("dev")
@Bean
public DataSource devDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setUrl(url);
dataSource.setDriverClassName(driverClassName);
return dataSource;
}
@Profile("test")
@Bean
public DataSource testDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setUrl(url);
dataSource.setDriverClassName(driverClassName);
return dataSource;
}
@Profile("prod")
@Bean
public DataSource prodDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setUrl(url);
dataSource.setDriverClassName(driverClassName);
return dataSource;
}
}DataSourceController測試Controller
創(chuàng)建一個(gè)Controller來測試獲取數(shù)據(jù),這里使用JdbcTemplate來獲取數(shù)據(jù),
package com.steakliu.druiddatasource.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
@RestController
public class DataSourceController {
@Autowired
private JdbcTemplate jdbcTemplate;
@GetMapping("datasource")
public List<Map<String, Object>> datasource(){
List<Map<String, Object>> maps = jdbcTemplate.queryForList("SELECT * FROM sys_env");
return maps;
}
}使用Postman進(jìn)行測試
spring.profiles.active = dev
spring:
profiles:
active: dev

spring.profiles.active = test
spring:
profiles:
active: test

spring.profiles.active = prod
spring:
profiles:
active: dev
到這里我們完成了開發(fā)環(huán)境,測試環(huán)境,生產(chǎn)環(huán)境的切換,其核心就是spring.profiles.active和@Profile注解,那么這時(shí)候你可能會(huì)覺得,每次打包發(fā)布前都需要 去application.yml配置文件中修改spring.profiles.active,是不是有點(diǎn)麻煩,沒錯(cuò),確實(shí)會(huì)有點(diǎn)麻煩,那么我們下面對其改造,使用Maven的profile 來改造,實(shí)現(xiàn)勾選式的配置。
使用Maven配置
我們在maven中對dev,test,prod進(jìn)行定義,如下,使用<profiles>標(biāo)簽進(jìn)行包裹,使用<activeByDefault>標(biāo)簽將dev作為默認(rèn)的環(huán)境, 在<properties>中定義環(huán)境標(biāo)識(shí)(dev,test,prod),<mvn.profile>是自定義的,可以任意定義,它和application.yml 那邊進(jìn)行對應(yīng)。
pom.xml
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<mvn.profile>dev</mvn.profile>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<mvn.profile>test</mvn.profile>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<mvn.profile>prod</mvn.profile>
</properties>
</profile>
</profiles>
application.yml
application.yml里面使用@mvn.profile@這種方式來讀取pom.xml中的配置。
spring:
profiles:
active: @mvn.profile@
定義好上面的pom.xml和application.yml后,會(huì)在我們IDEA編譯器右側(cè)的Maven欄下出現(xiàn)Profiles,就可以 進(jìn)行選擇了,所實(shí)現(xiàn)的效果和直接在applicaiton.yml中修改是一樣的。

除了上面的這兩種,我們還可以在IDEA里面進(jìn)行指定,也能達(dá)到同樣的效果。

后記
關(guān)于使用Spring的@Profile實(shí)現(xiàn)環(huán)境之間的切換就說到這里,配置多環(huán)境有很多中方案,主要是看那種適合我們。
以上就是Spring注解@Profile實(shí)現(xiàn)開發(fā)環(huán)境/測試環(huán)境/生產(chǎn)環(huán)境的切換的詳細(xì)內(nèi)容,更多關(guān)于Spring @Profile環(huán)境切換的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java數(shù)據(jù)結(jié)構(gòu)中的HashMap和HashSet詳解
HashMap和HashSet都是存儲(chǔ)在哈希桶之中,通過本文我們可以先了解一些哈希桶是什么,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-10-10
Java并發(fā)程序刺客之假共享的原理及復(fù)現(xiàn)
前段時(shí)間在各種社交平臺(tái)“雪糕刺客”這個(gè)詞比較火,而在并發(fā)程序中也有一個(gè)刺客,那就是假共享。本文將通過示例詳細(xì)講解假共享的原理及復(fù)現(xiàn),需要的可以參考一下2022-08-08
詳解Spring Boot中使用AOP統(tǒng)一處理Web請求日志
本篇文章主要介紹了詳解Spring Boot中使用AOP統(tǒng)一處理Web請求日志,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
IDEA 顯示Run Dashboard窗口的2種方式(推薦)
這篇文章主要介紹了IDEA 顯示Run Dashboard窗口的2種方式,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
POI通用導(dǎo)出Excel(.xls,.xlsx)的方法
這篇文章主要介紹了POI通用導(dǎo)出Excel(.xls,.xlsx)的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
Spring Boot下如何自定義Repository中的DAO方法
這篇文章主要介紹了Spring Boot下如何自定義Repository中的DAO方法,需要的朋友可以參考下2017-06-06
詳解關(guān)于mybatis-plus中Service和Mapper的分析
這篇文章主要介紹了詳解關(guān)于mybatis-plus中Service和Mapper的分析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09

