SpringBoot之Profile的兩種使用方式詳解
0. 需求
通常項(xiàng)目開發(fā)過(guò)程中,會(huì)經(jīng)歷多種環(huán)境轉(zhuǎn)換,典型的如開發(fā)環(huán)境(dev)、測(cè)試環(huán)境(test)和生產(chǎn)環(huán)境(prod)。在這三種不同的環(huán)境下,連接數(shù)據(jù)庫(kù)時(shí)使用的配置信息是不同的,即三個(gè)不同環(huán)境對(duì)應(yīng)三個(gè)不同的數(shù)據(jù)庫(kù)。
現(xiàn)在的需求是:當(dāng)在不同的環(huán)境下,想通過(guò)修改配置文件來(lái)連接不同的數(shù)據(jù)庫(kù)。比如在開發(fā)過(guò)程中啟動(dòng)項(xiàng)目時(shí),想連接開發(fā)環(huán)境對(duì)應(yīng)的數(shù)據(jù)庫(kù),可以在配置文件中指定 environment = dev。其他環(huán)境類似,此時(shí)就需要用到Spring為我們提供的Profile功能。
1. 采用一個(gè)配置文件的情況
當(dāng)SpringBoot項(xiàng)目只使用一個(gè)配置文件(application.yml或application.properties)時(shí),如果想在這個(gè)配置文件中通過(guò)配置切換不同數(shù)據(jù)源,可以按照如下步驟:
1.1. 數(shù)據(jù)源類
package com.shg.spring.ioc.bean;
import lombok.Data;
@Data
public class MyDataSource {
private String username;
private String password;
private String url;
private String driver;
}1.2. 數(shù)據(jù)源配置類
package com.shg.spring.ioc.config;
import com.shg.spring.ioc.bean.MyDataSource;
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;
@Configuration
public class MyDataSourceConfig {
@Value("${jdbc.user.dev}")
private String usernameForDev;
@Value("${jdbc.password.dev}")
private String passwordForDev;
@Value("${jdbc.jdbcUrl.dev}")
private String urlForDev;
@Value("${jdbc.driverClass.dev}")
private String driverForDev;
@Value("${jdbc.user.test}")
private String usernameForTest;
@Value("${jdbc.password.test}")
private String passwordForTest;
@Value("${jdbc.jdbcUrl.test}")
private String urlForTest;
@Value("${jdbc.driverClass.test}")
private String driverForTest;
@Value("${jdbc.user.prod}")
private String usernameForProd;
@Value("${jdbc.password.pro}")
private String passwordForProd;
@Value("${jdbc.jdbcUrl.pro}")
private String urlForProd;
@Value("${jdbc.driverClass.pro}")
private String driverForProd;
@Profile(value = {"default", "dev"})
@Bean
public MyDataSource dev() {
MyDataSource myDataSource = new MyDataSource();
myDataSource.setDriver(driverForDev);
myDataSource.setUrl(urlForDev);
myDataSource.setUsername(usernameForDev);
myDataSource.setPassword(passwordForDev);
return myDataSource;
}
@Profile(value = {"test"})
@Bean
public MyDataSource test() {
MyDataSource myDataSource = new MyDataSource();
myDataSource.setDriver(driverForTest);
myDataSource.setUrl(urlForTest);
myDataSource.setUsername(usernameForTest);
myDataSource.setPassword(passwordForTest);
return myDataSource;
}
@Profile(value = {"prod"})
@Bean
public MyDataSource prod() {
MyDataSource myDataSource = new MyDataSource();
myDataSource.setDriver(driverForProd);
myDataSource.setUrl(urlForProd);
myDataSource.setUsername(usernameForProd);
myDataSource.setPassword(passwordForProd);
return myDataSource;
}
}1.3 DAO層用到數(shù)據(jù)源
package com.shg.spring.ioc.dao;
import com.shg.spring.ioc.bean.MyDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
public class HelloDao {
// DAO層需要注入數(shù)據(jù)源
@Autowired
private MyDataSource myDataSource;
// 保存發(fā)貨信息
public void saveDelivery() {
System.out.println("保存發(fā)貨信息...用的數(shù)據(jù)源信息是:" + myDataSource);
}
}1.4. 配置文件
spring.application.name=spring-01-ioc spring.profiles.active=dev jdbc.jdbcUrl.dev=jdbc:mysql://localhost:3306/dev jdbc.driverClass.dev=com.mysql.jdbc.Driver jdbc.user.dev=root jdbc.password.dev=123 jdbc.jdbcUrl.test=jdbc:mysql://localhost:3306/test jdbc.driverClass.test=com.mysql.jdbc.Driver jdbc.user.test=root jdbc.password.test=123 jdbc.jdbcUrl.prod=jdbc:mysql://localhost:3306/prod jdbc.driverClass.prod=com.mysql.jdbc.Driver jdbc.user.prod=root jdbc.password.prod=123
1.5. 測(cè)試代碼
package com.shg.spring.ioc;
import com.shg.spring.ioc.dao.HelloDao;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class Spring01IocApplication {
public static void main(String[] args) {
ConfigurableApplicationContext ioc = SpringApplication.run(Spring01IocApplication.class, args);
HelloDao helloDao = ioc.getBean(HelloDao.class);
helloDao.saveDelivery();
}
}1.6. 測(cè)試結(jié)果
1.6.1 配置文件中的spring.profiles=dev

1.6.2 配置文件中的spring.profiles=test

1.6.3 配置文件中的spring.profiles=prod

2. 采用多個(gè)配置文件的情況
上面的例子中,只使用一個(gè)配置文件。需要在這個(gè)配置文件中配置三種環(huán)境的配置信息,感覺不太好...
【你也可能會(huì)反駁說(shuō),我直接使用一組配置信息,不分什么dev,test和prod環(huán)境,在配置類中也不用標(biāo)注@Profile注解,而是在部署對(duì)應(yīng)環(huán)境的時(shí)候,修改這個(gè)數(shù)據(jù)源的配置信息,這當(dāng)然也是可以的,但是不要忘了我們現(xiàn)在是在討論 Profile這個(gè)功能,這樣舉例子會(huì)更加清楚明了】
下面我們采用另一種方式,來(lái)實(shí)現(xiàn)我們的需求,即:在不同的環(huán)境下,可以直接通過(guò)修改配置文件來(lái)連接不同的數(shù)據(jù)庫(kù)。
2.1 . 三個(gè)環(huán)境對(duì)應(yīng)的配置文件

2.1.1 dev環(huán)境的配置信息

2.1.2 test環(huán)境的配置信息

2.1.3 prod環(huán)境的配置信息

2.2. 數(shù)據(jù)源類
package com.shg.spring.ioc.bean;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Data
@Component
public class MyDataSource {
@Value("${jdbc.user}")
private String usernameForDev;
@Value("${jdbc.password}")
private String passwordForDev;
@Value("${jdbc.jdbcUrl}")
private String urlForDev;
@Value("${jdbc.driverClass}")
private String driverForDev;
}2.3. DAO層需要用到數(shù)據(jù)源
package com.shg.spring.ioc.dao;
import com.shg.spring.ioc.bean.MyDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
public class HelloDao {
// DAO層需要注入數(shù)據(jù)源
@Autowired
private MyDataSource myDataSource;
// 保存發(fā)貨信息
public void saveDelivery() {
System.out.println("保存發(fā)貨信息...用的數(shù)據(jù)源信息是:" + myDataSource);
}
}2.4. 在主配置文件中開啟需要使用哪個(gè)環(huán)境的配置文件
2.4.1. 開啟dev

測(cè)試結(jié)果:

2.4.2. 開啟test

測(cè)試結(jié)果:

2.4.3. 開啟prod

測(cè)試結(jié)果:

3. 使用建議
在實(shí)際項(xiàng)目中,推薦在不同環(huán)境使用不同的配置文件。
以上就是SpringBoot之Profile的兩種使用方式詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Profile使用方式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringSecurity Jwt Token 自動(dòng)刷新的實(shí)現(xiàn)
這篇文章主要介紹了SpringSecurity Jwt Token 自動(dòng)刷新的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
SpringBoot集成圖片驗(yàn)證碼框架easy-captcha的詳細(xì)過(guò)程
本文介紹了如何將Easy-Captcha框架集成到SpringBoot項(xiàng)目中,實(shí)現(xiàn)圖片驗(yàn)證碼功能,Easy-Captcha是一款輕量級(jí)的開源驗(yàn)證碼框架,通過(guò)簡(jiǎn)潔的API和高度可定制性,可以快速實(shí)現(xiàn)驗(yàn)證碼功能,文章詳細(xì)介紹了如何配置、生成和展示驗(yàn)證碼,并提供了Easy-Captcha的GitHub地址2025-03-03
SpringBoot對(duì)數(shù)據(jù)訪問(wèn)層進(jìn)行單元測(cè)試的方法詳解
我們公司作為一個(gè)面向銀行、金融機(jī)構(gòu)的TO B類企業(yè),頻繁遇到各個(gè)甲方爸爸提出的國(guó)產(chǎn)化數(shù)據(jù)庫(kù)的改造需求,包括OceanBase, TiDB,geldenDB等等,本文就介紹一種快高效、可復(fù)用的解決方案——對(duì)數(shù)據(jù)訪問(wèn)層做單元測(cè)試,需要的朋友可以參考下2023-08-08
Spring?Boot?基于?SCRAM?認(rèn)證集成?Kafka?的過(guò)程詳解
在本篇文章中,我們將探討如何在?Spring?Boot?應(yīng)用中集成?Kafka?并使用?SCRAM?認(rèn)證機(jī)制進(jìn)行安全連接,并實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建賬號(hào)、ACL?權(quán)限、Topic,以及生產(chǎn)者和消費(fèi)者等操作,感興趣的朋友跟隨小編一起看看吧2024-08-08
java實(shí)現(xiàn)自定義時(shí)鐘并實(shí)現(xiàn)走時(shí)功能
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)自定義時(shí)鐘并實(shí)現(xiàn)走時(shí)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06

