AbstractRoutingDataSource 简介

最近在看mysql读写分离,可以用 mycat 实现,也可以用spring 多数据源来实现。这个百度一下有很多实现我这就不说了。主要是写一个类继承 AbstractRoutingDataSource 这个抽象类。这个类我大概看了一下,比较简单在这里记录一下。这个类的大体想法就是代理真正的 DataSource 。但是它代理的又不是一个 DataSource ,是好几个数据源,在内部用一个Map保存。属性是 targetDataSource 。在调用 getConnection 的时候先调用抽象方法 determineCurrentLookUpKey,获取当前线程想要使用哪个 DataSource ,在用代理的数据源获取connection。此类还实现了 InitialzingBean,在创建之后会回调afterPropertiesSet 方法。这个方法里面主要是通过 targetDataSource 和 defaultDataSource 生成 resolvedDataSource和resolvedDefaultDataSource。我们在使用这个类的时候主要是设置 targetDataSource 这个map和defaultDataSource。但是这两个属性定义都是 Object 也就是说。不止可以放 DataSource 也可以设置任意类型。可是 resolvedDataSource和 resolvedDefaultDataSource 都是定义的 DataSource 类型。InitialzingBean 就是处理这个两对属性的映射的将targetDataSource 这个Map 转换成 resolvedDataSource 这个Map,将Object 类型的 defaultDataSource 对象转换成 DataSource 类型的resolvedDataSource 对象。这个过程中涉及到另一个接口 DataSourceLookUp,这个接口主要是将 targetDataSource 这个Map中的 value 值转化成 真正的 DataSource对象,默认的是 Jndi 实现。处理 String 类型。也就是说我们在设置 targetDataSource 的时候既可以放 这种形式,也可以放 这种形式。放其他的会抛异常。

你可能感兴趣的:(spring,boot)