Spring-AbstractRoutingDataSource
作者:互联网
注:spring提供了一个多数据源解决方案:AbstractRoutingDataSource。最近项目用到了多数据源。简单看一下这个类,做个学习笔记。
从继承上看,AbstractRoutingDataSource继承AbstractDataSource。AbstractDataSource实现DataSource接口。那么AbstractRoutingDataSource就是一批DataSource实例的集合体。
操作数据库首先获取Connection。AbstracRoutingDataSource通过实现DataSource接口getConnection来操作数据源。
-
AbstractRoutingDataSource的getConnection实现
-
实际是通过determineTargetDataSource去获取connection。
determineTargetDataSource方法也很简单,通过LookupKey去resolvedDataSources(一个Map)中找到对应的数据源。如果没找到,就获取默认的dataSource。
从方法实现中可以看出。是通过一个抽象方法:determineCurrentLookupKey获取需要LookupKey。这个抽象方法需要自定义类实现。(根据自己业务需求实现改抽象方法) -
数据源怎么被放到resolvedDataSources中?
可以看到这个类实现了初始化方法afterPropertiesSet。实例化bean后,初始化会调用这个方法。
afterPropertiesSet把targetDataSources(也是一个Map)中的DataSource做了加工和校验后放入了resolvedDataSources。
defaultTargetDataSource也赋值给resolveDefaultDataSource。
因此,我们只需要将数据源结合和默认数据源通过AbstractRoutingDataSource提供的set方法放入targetDataSources和defaultTargetDataSource就可以(可以在xml配置文件中注入属性到自定义继承AbstractRoutingDataSource的类中)。 -
自定义类继承AbstractRoutingDataSource
/**
获取数据源(依赖于spring)
*/
public class DynamicDataSource extends AbstractRoutingDataSource{
@Override
protected Object determineCurrentLookupKey() {
return DataSourceHolder.getDataSource();
}
}
DataSourceHolder这个类则是我们自己封装的对数据源进行操作的类:
/** * 数据源操作 */
public class DataSourceHolder {
//线程本地环境
private static final ThreadLocal<String> dataSources = new ThreadLocal<String>();
//设置数据源
public static void setDataSource(String customerType) {
dataSources.set(customerType);
}
//获取数据源
public static String getDataSource() {
return (String) dataSources.get();
}
//清除数据源
public static void clearDataSource() {
dataSources.remove();
} }
标签:dataSources,Spring,AbstractRoutingDataSource,static,DataSource,数据源,public 来源: https://blog.csdn.net/xiaopang2020/article/details/120776950