紧接上篇 - 实现

1 创建 DynamicDataSource 继承 AbstractRoutingDataSource 重写 determineCurrentLookupKey 方法

/**
                 * 
                 * @Author: ll
                 * @Date: 2018年5月29日 上午10:32:32
                 * @Description: 多数据源
                 * @Version: 1.0 
                 */
            public class DynamicDataSource extends AbstractRoutingDataSource {
             @Override
             protected Object determineCurrentLookupKey() {
    return DynamicDataSourceHolder.getDatasource();  
            }

}

/**
                 * 
                 * @Author: ll
                 * @Date: 2018年5月29日 上午10:32:32
                 * @Description: 多数据源
                 * @Version: 1.0 
                 */
            public class DynamicDataSource extends AbstractRoutingDataSource {
                 @Override
                protected Object determineCurrentLookupKey() {
            return DynamicDataSourceHolder.getDatasource();  
                   }

}

2 实现 DynamicDataSourceHolder 类

/**
             * 
             * @Author: ll
             * @Date: 2018年5月29日 下午10:32:32
             * @Description: 多数据源
             * @Version: 1.0 
             */

public class DynamicDataSourceHolder {

/** 数据源标识保存在线程变量中,避免多线程操作数据源时互相干扰 */

private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();  
      
                        /** 
                             * 设置数据源名称 
                             * @param dastsource 数据源名称 
                             */  
                    public static void setDatasource(String datasource) {  
                        contextHolder.set(datasource);  
                        }  
      
                /** 
                 * 获取数据源名称 
                 * @return 数据源名称 
                 */  
                    public static String getDatasource() {  
                        return contextHolder.get();  
                    }  
      
                    /** 
                     * 清除标志 
                     */  
                    public static void clearDatasource() {  
                        contextHolder.remove();  
                    }

}

3 配置多数据源 

由于代码较多 在此粘出关键代码

<bean id="dataSource" class="com.enter.net.frame.datasources.DynamicDataSource">  
        <property name="targetDataSources">  
            <map key-type="java.lang.String">  
                <entry key="fxdataSource" value-ref="fxdataSource"></entry>  
                <entry key="gblzdataSource" value-ref="gblzdataSource"></entry>  
            </map>

</property>

<!-- 默认使用的数据库-->

<property name="defaultTargetDataSource" ref="fxdataSource"></property>

</bean>

4 使用数据源 

本人准备使用注解的方式同时结合spring的AOP

首先定义个一个注解 DataSource

/**
 * 
 * @Author: ll
 * @Date: 2018年5月29日 上午10:32:32
 * @Description: 多数据源注解
 * @Version: 1.0 
 */
@Target({ElementType.TYPE, ElementType.METHOD})  
@Retention(RetentionPolicy.RUNTIME)  
public @interface DataSource {  
    String value();

}

2 定义一个切面

/**
 * 
 * @Author: ll
 * @Date: 2018年5月29日 上午10:32:32
 * @Description: 多数据源切面
 * @Version: 1.0 
 */
@Aspect
@Component
public class DynamicDataSourceInterceptor {
/** 
     * 拦截目标方法,获取由@DataSource指定的数据源标识,设置到线程存储中以便切换数据源 
     * @param point 
     * @throws Exception 
     */  
@Before("execution(* com.enter.net.fhbusiness..*Controller.*(..)) or execution(* com.enter.net.system..*Controller.*(..))")
    public void intercept(JoinPoint point) throws Exception {  
        Class<?> target = point.getTarget().getClass();  
        MethodSignature signature = (MethodSignature) point.getSignature();  
        resolveDataSource(target, signature.getMethod());  
    }  
  
    /** 
     * 提取目标对象方法注解和类型注解中的数据源标识 
     * @param clazz 
     * @param method 
     */  
    private void resolveDataSource(Class<?> clazz, Method method) {  
        try {  
            Class<?>[] types = method.getParameterTypes();
            // 默认使用类型注解  
            if (clazz.isAnnotationPresent(DataSource.class)) {  
                DataSource source = clazz.getAnnotation(DataSource.class);  
                DynamicDataSourceHolder.setDatasource(source.value());  
            }  
            // 方法注解可以覆盖类型注解  
            if(types.length!=0) {
            Method m = clazz.getMethod(method.getName(), types);  
                 if (m != null && m.isAnnotationPresent(DataSource.class)) {  
                     DataSource source = m.getAnnotation(DataSource.class);  
                     DynamicDataSourceHolder.setDatasource(source.value());  
                 } 
            }
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }

}

这时候切面 会根据配置的表达式 进行拦截查看是否使用DataSource 注解 如果使用 则获取注解的值 来设定指定的s

下一篇 https://blog.csdn.net/lilongwangyamin/article/details/80507121 总结

spring 多数据源-实现相关推荐

  1. Spring多数据源配置和使用

    Spring多数据源配置和使用 1.配置信息 <!--==============================bpt_mobdb数据库配置========================== ...

  2. spring(16)------spring的数据源配置

    spring(16)------spring的数据源配置 在spring中,通过XML的形式实现数据源的注入有三种形式. 一.使用spring自带的DriverManagerDataSource 使用 ...

  3. 搭建eclipse版的ssm+maven+tk.mybatis+redis及mybatis+spring多数据源配置集成的demo

    前言:我这里搭建好eclipse版的ssm+maven+tk.mybatis+redis及mybatis+spring多数据源配置集成的demo.新手快速上手直接看demo. 最后处提供完整高质量de ...

  4. spring 动态数据源

    1.动态数据源:  在一个项目中,有时候需要用到多个数据库,比如读写分离,数据库的分布式存储等等,这时我们要在项目中配置多个数据库. 2.原理:   (1).spring 单数据源获取数据连接过程: ...

  5. 深入理解Spring Boot数据源与连接池原理

    ​ Create by yster@foxmail.com 2018-8-2 一:开始 在使用Spring Boot数据源之前,我们一般会导入相关依赖.其中数据源核心依赖就是spring‐boot‐s ...

  6. 我已经把它摸的透透的了!!!Spring 动态数据源设计实践,全面解析

    [ Spring 动态数据源 动态数据源是什么?它能解决什么??? 在实际的开发中,同一个项目中使用多个数据源是很常见的场景.比如,一个读写分离的项目存在主数据源与读数据源. 所谓动态数据源,就是通过 ...

  7. spring—配置数据源

    数据源(连接池)的作用 数据源(连接池)是提高程序性能如出现的 事先实例化数据源,初始化部分连接资源 使用连接资源时从数据源中获取 使用完毕后将连接资源归还给数据源 常见的数据源(连接池):DBCP. ...

  8. Spring笔记——数据源配置

    常见的数据源(连接池)包括:DBCP.C3P0.BoneCP.Druid等接下来以C3P0为例讲述一下spring配置数据源的过程数据源的开发步骤 ①导入数据源的坐标和数据库驱动坐标 ②设置数据源的基 ...

  9. Spring之数据源整理

    Spring通过数据源获取与各种数据库的连接,怎么理解数据源呢?通俗来讲,数据源可以看作是一个灵活.便捷的连接工厂,这个工厂可以根据实际需要动态地维护池中连接的数量.健康程度.事务等.在以往的应用中, ...

  10. 让媳妇瞬间搞懂Spring 多数据源操作(SpringBoot + Durid)

    1.快速理解 Spring 多数据源操作 最近在调研 Spring 如何配置多数据源的操作,结果被媳妇吐槽,整天就坐在那打电脑,啥都不干.于是我灵光一现,跟我媳妇说了一下调研结果,第一版本原话如下: ...

最新文章

  1. Mask Rcnn训练自己的航拍数据集
  2. 3Blue1Brown深度学习笔记 深度学习之神经网络的结构 Part 1 ver 2.0
  3. hdu1353 小暴力
  4. linux ssh连接交换机_linux SSH 隧道
  5. 成功解决ValueError: Cannot feed value of shape (1, 10, 4) for Tensor Placeholder:0 , which has shape
  6. python办公代码_[Python] 自动化办公 docx操作Word基础代码
  7. Django的信号机制详解
  8. LoadRunner的Oracle计数器
  9. H3C 路由器 与 CISCO 路由器在配置上的差别
  10. PHP 9: 表达式
  11. Qt天气助手小程序(QCutomPlot绘图)
  12. python做meta分析_浅析python的metaclass
  13. 一个废物大学生对于视频爬取的小小的总结
  14. python爬取微信好友教程_Python爬取微信好友
  15. 超详细的Latex快速基础入门 (第二节)【关于latex命令的一些知识】
  16. 七牛图片上传的使用心得[PHP篇]
  17. 四极管:IIC之AVR 24c64读写
  18. Lenovo笔记本电脑触摸板无反应-解决方法
  19. 数据结构与算法基础——重要知识点截图【青岛大学-王卓版】
  20. 后台管理系统项目流程及逻辑处理(一)

热门文章

  1. axios get post下载文件
  2. 小弟个人学习的过程!!!
  3. codeforces 558E A Simple Task 线段树
  4. string.empty , , null 以及性能的比较
  5. Git小技巧 - 指令别名及使用Beyond Compare作为差异比较工具
  6. 《软件测试技术》课程第二周随笔
  7. Python基础学习数值运算之内建函数
  8. python中正则表达式的默认匹配方式为_Python模式匹配与正则表达式
  9. linux命令行 基础,Linux命令行基础,关于Bash需要知道的一些常识
  10. mysql 大分页查询优化_Mysql骚操作:优化大分页查询