其他分享
首页 > 其他分享> > Spring-AbstractRoutingDataSource

Spring-AbstractRoutingDataSource

作者:互联网

:spring提供了一个多数据源解决方案:AbstractRoutingDataSource。最近项目用到了多数据源。简单看一下这个类,做个学习笔记。

在这里插入图片描述
在这里插入图片描述

从继承上看,AbstractRoutingDataSource继承AbstractDataSource。AbstractDataSource实现DataSource接口。那么AbstractRoutingDataSource就是一批DataSource实例的集合体。

操作数据库首先获取Connection。AbstracRoutingDataSource通过实现DataSource接口getConnection来操作数据源。

  1. AbstractRoutingDataSource的getConnection实现
    在这里插入图片描述

  2. 实际是通过determineTargetDataSource去获取connection。
    determineTargetDataSource方法也很简单,通过LookupKey去resolvedDataSources(一个Map)中找到对应的数据源。如果没找到,就获取默认的dataSource。
    在这里插入图片描述
    从方法实现中可以看出。是通过一个抽象方法:determineCurrentLookupKey获取需要LookupKey。这个抽象方法需要自定义类实现。(根据自己业务需求实现改抽象方法)

  3. 数据源怎么被放到resolvedDataSources中?
    在这里插入图片描述
    可以看到这个类实现了初始化方法afterPropertiesSet。实例化bean后,初始化会调用这个方法。
    afterPropertiesSet把targetDataSources(也是一个Map)中的DataSource做了加工和校验后放入了resolvedDataSources。
    defaultTargetDataSource也赋值给resolveDefaultDataSource。
    因此,我们只需要将数据源结合和默认数据源通过AbstractRoutingDataSource提供的set方法放入targetDataSources和defaultTargetDataSource就可以(可以在xml配置文件中注入属性到自定义继承AbstractRoutingDataSource的类中)

  4. 自定义类继承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