1、是使用Spring提供的AbstractRoutingDataSource抽象類
注入多個數據源。
?
創建?DataSourceConfig 配置類? 通過spring jdbc 提供的帶路由的抽象數據源?AbstractRoutingDataSource
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import org.springframework.stereotype.Component;import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;@Component
@Primary // 將該Bean設置為主要注入Bean
public class DynamicDataSource extends AbstractRoutingDataSource {// 當前使用的數據源標識public static ThreadLocal<String> name = new ThreadLocal<>();// 寫@AutowiredDataSource dataSource1;// 讀@AutowiredDataSource dataSource2;// 返回當前數據源標識@Overrideprotected Object determineCurrentLookupKey() {return name.get();}@Overridepublic void afterPropertiesSet() {// 為targetDataSources初始化所有數據源Map<Object, Object> targetDataSources = new HashMap<>();targetDataSources.put("W", dataSource1);targetDataSources.put("R", dataSource2);super.setTargetDataSources(targetDataSources);// 為defaultTargetDataSource 設置默認的數據源super.setDefaultTargetDataSource(dataSource1);super.afterPropertiesSet();}
}
讀取配置文件數據源
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.tuling.dynamic.datasource.DynamicDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;import javax.sql.DataSource;@Configuration
public class DataSourceConfig {@Bean@ConfigurationProperties(prefix = "spring.datasource.datasource1")public DataSource dataSource1() {// 底層會自動拿到spring.datasource中的配置, 創建一個DruidDataSourcereturn DruidDataSourceBuilder.create().build();}@Bean@ConfigurationProperties(prefix = "spring.datasource.datasource2")public DataSource dataSource2() {// 底層會自動拿到spring.datasource中的配置, 創建一個DruidDataSourcereturn DruidDataSourceBuilder.create().build();}@Beanpublic DataSourceTransactionManager transactionManager1(DynamicDataSource dataSource) {DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();dataSourceTransactionManager.setDataSource(dataSource);return dataSourceTransactionManager;}@Beanpublic DataSourceTransactionManager transactionManager2(DynamicDataSource dataSource) {DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();dataSourceTransactionManager.setDataSource(dataSource);return dataSourceTransactionManager;}
}
配置文件
spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedatasource1:url: jdbc:mysql://127.0.0.1:3306/datasource1?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF8&useSSL=falseusername: rootpassword: 123456initial-size: 1min-idle: 1max-active: 20test-on-borrow: truedriver-class-name: com.mysql.cj.jdbc.Driverdatasource2:url: jdbc:mysql://127.0.0.1:3306/datasource2?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF8&useSSL=falseusername: rootpassword: 123456initial-size: 1min-idle: 1max-active: 20test-on-borrow: truedriver-class-name: com.mysql.cj.jdbc.Driver
自定義數據源注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.METHOD, ElementType.TYPE})
// 保留方式
@Retention(RetentionPolicy.RUNTIME)
public @interface WR {String value() default "W";
}
注解的實現方法
import com.tuling.dynamic.datasource.DynamicDataSource;
import com.tuling.dynamic.datasource.annotation.WR;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;@Component
@Aspect
public class DynamicDataSourceAspect implements Ordered {// 前置@Before("within(com.tuling.dynamic.datasource.service.impl.*) && @annotation(wr)")public void before(JoinPoint point, WR wr) {String name = wr.value();DynamicDataSource.name.set(name);System.out.println(name);}@Overridepublic int getOrder() {return 0;}// 環繞通知
}
2、使用dynamic-datasource框架
dynamic-datasource是MyBaits-plus作者設計的一個多數據源開源方案。使用這個框架需要引入對應的pom依賴
引入依賴
<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.0</version> </dependency>
添加配置文件?
spring:datasource:dynamic:#設置默認的數據源或者數據源組,默認值即為masterprimary: master#嚴格匹配數據源,默認false. true未匹配到指定數據源時拋異常,false使用默認數據源strict: falsedatasource:master:url: jdbc:mysql://127.0.0.1:3306/datasource1?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF8&useSSL=falseusername: rootpassword: 123456initial-size: 1min-idle: 1max-active: 20test-on-borrow: truedriver-class-name: com.mysql.cj.jdbc.Driverslave_1:url: jdbc:mysql://127.0.0.1:3306/datasource2?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF8&useSSL=falseusername: rootpassword: 123456initial-size: 1min-idle: 1max-active: 20test-on-borrow: truedriver-class-name: com.mysql.cj.jdbc.Driver
?無需任何配置文件? 需要在services 指定數據源 ? 使用@DS注解
通過注解 查看源碼 點進入 注解
通過點進入 注解? 找到對應的源碼包
找到spring.factories 配置文件 找到核心自動配置類
找到數據源??DynamicRoutingDataSource?
mp 苞米豆 對 spring jdbc 封裝的,
通過實現接口?InitializingBean