SpringBoot之Profile的兩種使用方式詳解
0. 需求
通常項目開發(fā)過程中,會經歷多種環(huán)境轉換,典型的如開發(fā)環(huán)境(dev)、測試環(huán)境(test)和生產環(huán)境(prod)。在這三種不同的環(huán)境下,連接數據庫時使用的配置信息是不同的,即三個不同環(huán)境對應三個不同的數據庫。
現(xiàn)在的需求是:當在不同的環(huán)境下,想通過修改配置文件來連接不同的數據庫。比如在開發(fā)過程中啟動項目時,想連接開發(fā)環(huán)境對應的數據庫,可以在配置文件中指定 environment = dev。其他環(huán)境類似,此時就需要用到Spring為我們提供的Profile功能。
1. 采用一個配置文件的情況
當SpringBoot項目只使用一個配置文件(application.yml或application.properties)時,如果想在這個配置文件中通過配置切換不同數據源,可以按照如下步驟:
1.1. 數據源類
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. 數據源配置類
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層用到數據源
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層需要注入數據源 @Autowired private MyDataSource myDataSource; // 保存發(fā)貨信息 public void saveDelivery() { System.out.println("保存發(fā)貨信息...用的數據源信息是:" + 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. 測試結果
1.6.1 配置文件中的spring.profiles=dev
1.6.2 配置文件中的spring.profiles=test
1.6.3 配置文件中的spring.profiles=prod
2. 采用多個配置文件的情況
上面的例子中,只使用一個配置文件。需要在這個配置文件中配置三種環(huán)境的配置信息,感覺不太好...
【你也可能會反駁說,我直接使用一組配置信息,不分什么dev,test和prod環(huán)境,在配置類中也不用標注@Profile注解,而是在部署對應環(huán)境的時候,修改這個數據源的配置信息,這當然也是可以的,但是不要忘了我們現(xiàn)在是在討論 Profile這個功能,這樣舉例子會更加清楚明了】
下面我們采用另一種方式,來實現(xiàn)我們的需求,即:在不同的環(huán)境下,可以直接通過修改配置文件來連接不同的數據庫。
2.1 . 三個環(huán)境對應的配置文件
2.1.1 dev環(huán)境的配置信息
2.1.2 test環(huán)境的配置信息
2.1.3 prod環(huán)境的配置信息
2.2. 數據源類
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層需要用到數據源
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層需要注入數據源 @Autowired private MyDataSource myDataSource; // 保存發(fā)貨信息 public void saveDelivery() { System.out.println("保存發(fā)貨信息...用的數據源信息是:" + myDataSource); } }
2.4. 在主配置文件中開啟需要使用哪個環(huán)境的配置文件
2.4.1. 開啟dev
測試結果:
2.4.2. 開啟test
測試結果:
2.4.3. 開啟prod
測試結果:
3. 使用建議
在實際項目中,推薦在不同環(huán)境使用不同的配置文件。
以上就是SpringBoot之Profile的兩種使用方式詳解的詳細內容,更多關于SpringBoot Profile使用方式的資料請關注腳本之家其它相關文章!
相關文章
SpringBoot內置tomcat參數調優(yōu)的實現(xiàn)
springboot內置了tomcat, 并給我們設置了默認參數, 我們怎么樣修改springboot內置的tomcat參數,本文就詳細的來介紹一下,感興趣的可以了解一下2023-09-09