com.baomidou.dynamic.datasource.ds.AbstractRoutingDataSource
时间: 2023-12-29 16:24:22 浏览: 150
Dynamic-DataSource
com.baomidou.dynamic.datasource.ds.AbstractRoutingDataSource是一个抽象类,继承自javax.sql.DataSource接口和org.springframework.beans.factory.InitializingBean接口。它的主要作用是实现动态数据源的切换,具体实现类为com.baomidou.dynamic.datasource.DynamicRoutingDataSource。
在使用mybatis-plus时,我们可以通过继承AbstractRoutingDataSource并实现determineCurrentLookupKey()方法来实现动态数据源的切换。该方法返回一个字符串,表示当前使用的数据源名称。具体实现可以根据业务需求来定制。
在DynamicRoutingDataSource中,我们可以看到它继承了AbstractRoutingDataSource,并实现了determineDataSource()方法。该方法通过调用DynamicDataSourceContextHolder获取当前线程中存储的数据源名称,然后从dataSourceMap中获取对应的数据源。如果没有获取到,则使用默认的primary数据源。
示例代码如下:
```java
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DynamicDataSourceContextHolder.getDataSource();
}
}
public class DynamicDataSourceContextHolder {
private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
public static void setDataSource(String dataSource) {
CONTEXT_HOLDER.set(dataSource);
}
public static String getDataSource() {
return CONTEXT_HOLDER.get();
}
public static void clearDataSource() {
CONTEXT_HOLDER.remove();
}
}
public class DynamicDataSourceAspect {
@Before("@annotation(ds)")
public void switchDataSource(JoinPoint point, TargetDataSource ds) {
String dataSourceName = ds.value();
DynamicDataSourceContextHolder.setDataSource(dataSourceName);
}
@After("@annotation(ds)")
public void restoreDataSource(JoinPoint point, TargetDataSource ds) {
DynamicDataSourceContextHolder.clearDataSource(); }
}
```
阅读全文