SpringBoot之Profile的兩種使用方式詳解
0. 需求
通常項(xiàng)目開發(fā)過程中,會經(jīng)歷多種環(huán)境轉(zhuǎn)換,典型的如開發(fā)環(huán)境(dev)、測試環(huán)境(test)和生產(chǎn)環(huán)境(prod)。在這三種不同的環(huán)境下,連接數(shù)據(jù)庫時(shí)使用的配置信息是不同的,即三個(gè)不同環(huán)境對應(yīng)三個(gè)不同的數(shù)據(jù)庫。
現(xiàn)在的需求是:當(dāng)在不同的環(huán)境下,想通過修改配置文件來連接不同的數(shù)據(jù)庫。比如在開發(fā)過程中啟動項(xiàng)目時(shí),想連接開發(fā)環(huán)境對應(yīng)的數(shù)據(jù)庫,可以在配置文件中指定 environment = dev。其他環(huán)境類似,此時(shí)就需要用到Spring為我們提供的Profile功能。
1. 采用一個(gè)配置文件的情況
當(dāng)SpringBoot項(xiàng)目只使用一個(gè)配置文件(application.yml或application.properties)時(shí),如果想在這個(gè)配置文件中通過配置切換不同數(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. 測試代碼
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. 測試結(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)境的配置信息,感覺不太好...
【你也可能會反駁說,我直接使用一組配置信息,不分什么dev,test和prod環(huán)境,在配置類中也不用標(biāo)注@Profile注解,而是在部署對應(yīng)環(huán)境的時(shí)候,修改這個(gè)數(shù)據(jù)源的配置信息,這當(dāng)然也是可以的,但是不要忘了我們現(xiàn)在是在討論 Profile這個(gè)功能,這樣舉例子會更加清楚明了】
下面我們采用另一種方式,來實(shí)現(xiàn)我們的需求,即:在不同的環(huán)境下,可以直接通過修改配置文件來連接不同的數(shù)據(jù)庫。
2.1 . 三個(gè)環(huán)境對應(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
測試結(jié)果:
2.4.2. 開啟test
測試結(jié)果:
2.4.3. 開啟prod
測試結(jié)果:
3. 使用建議
在實(shí)際項(xiàng)目中,推薦在不同環(huán)境使用不同的配置文件。
以上就是SpringBoot之Profile的兩種使用方式詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Profile使用方式的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
spring?boot集成redisson的最佳實(shí)踐示例
這篇文章主要為大家介紹了spring?boot集成redisson的最佳實(shí)踐示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03SpringBoot內(nèi)置tomcat參數(shù)調(diào)優(yōu)的實(shí)現(xiàn)
springboot內(nèi)置了tomcat, 并給我們設(shè)置了默認(rèn)參數(shù), 我們怎么樣修改springboot內(nèi)置的tomcat參數(shù),本文就詳細(xì)的來介紹一下,感興趣的可以了解一下2023-09-09使用springmvc臨時(shí)不使用視圖解析器的自動添加前后綴
這篇文章主要介紹了使用springmvc臨時(shí)不使用視圖解析器的自動添加前后綴,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09淺談spring中用到的設(shè)計(jì)模式及應(yīng)用場景
下面小編就為大家?guī)硪黄獪\談spring中用到的設(shè)計(jì)模式及應(yīng)用場景。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08