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();
    } }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值