spring 多数据源-实现
紧接上篇 - 实现
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 多数据源-实现相关推荐
- Spring多数据源配置和使用
Spring多数据源配置和使用 1.配置信息 <!--==============================bpt_mobdb数据库配置========================== ...
- spring(16)------spring的数据源配置
spring(16)------spring的数据源配置 在spring中,通过XML的形式实现数据源的注入有三种形式. 一.使用spring自带的DriverManagerDataSource 使用 ...
- 搭建eclipse版的ssm+maven+tk.mybatis+redis及mybatis+spring多数据源配置集成的demo
前言:我这里搭建好eclipse版的ssm+maven+tk.mybatis+redis及mybatis+spring多数据源配置集成的demo.新手快速上手直接看demo. 最后处提供完整高质量de ...
- spring 动态数据源
1.动态数据源: 在一个项目中,有时候需要用到多个数据库,比如读写分离,数据库的分布式存储等等,这时我们要在项目中配置多个数据库. 2.原理: (1).spring 单数据源获取数据连接过程: ...
- 深入理解Spring Boot数据源与连接池原理
Create by yster@foxmail.com 2018-8-2 一:开始 在使用Spring Boot数据源之前,我们一般会导入相关依赖.其中数据源核心依赖就是spring‐boot‐s ...
- 我已经把它摸的透透的了!!!Spring 动态数据源设计实践,全面解析
[ Spring 动态数据源 动态数据源是什么?它能解决什么??? 在实际的开发中,同一个项目中使用多个数据源是很常见的场景.比如,一个读写分离的项目存在主数据源与读数据源. 所谓动态数据源,就是通过 ...
- spring—配置数据源
数据源(连接池)的作用 数据源(连接池)是提高程序性能如出现的 事先实例化数据源,初始化部分连接资源 使用连接资源时从数据源中获取 使用完毕后将连接资源归还给数据源 常见的数据源(连接池):DBCP. ...
- Spring笔记——数据源配置
常见的数据源(连接池)包括:DBCP.C3P0.BoneCP.Druid等接下来以C3P0为例讲述一下spring配置数据源的过程数据源的开发步骤 ①导入数据源的坐标和数据库驱动坐标 ②设置数据源的基 ...
- Spring之数据源整理
Spring通过数据源获取与各种数据库的连接,怎么理解数据源呢?通俗来讲,数据源可以看作是一个灵活.便捷的连接工厂,这个工厂可以根据实际需要动态地维护池中连接的数量.健康程度.事务等.在以往的应用中, ...
- 让媳妇瞬间搞懂Spring 多数据源操作(SpringBoot + Durid)
1.快速理解 Spring 多数据源操作 最近在调研 Spring 如何配置多数据源的操作,结果被媳妇吐槽,整天就坐在那打电脑,啥都不干.于是我灵光一现,跟我媳妇说了一下调研结果,第一版本原话如下: ...
最新文章
- Mask Rcnn训练自己的航拍数据集
- 3Blue1Brown深度学习笔记 深度学习之神经网络的结构 Part 1 ver 2.0
- hdu1353 小暴力
- linux ssh连接交换机_linux SSH 隧道
- 成功解决ValueError: Cannot feed value of shape (1, 10, 4) for Tensor Placeholder:0 , which has shape
- python办公代码_[Python] 自动化办公 docx操作Word基础代码
- Django的信号机制详解
- LoadRunner的Oracle计数器
- H3C 路由器 与 CISCO 路由器在配置上的差别
- PHP 9: 表达式
- Qt天气助手小程序(QCutomPlot绘图)
- python做meta分析_浅析python的metaclass
- 一个废物大学生对于视频爬取的小小的总结
- python爬取微信好友教程_Python爬取微信好友
- 超详细的Latex快速基础入门 (第二节)【关于latex命令的一些知识】
- 七牛图片上传的使用心得[PHP篇]
- 四极管:IIC之AVR 24c64读写
- Lenovo笔记本电脑触摸板无反应-解决方法
- 数据结构与算法基础——重要知识点截图【青岛大学-王卓版】
- 后台管理系统项目流程及逻辑处理(一)
热门文章
- axios get post下载文件
- 小弟个人学习的过程!!!
- codeforces 558E A Simple Task 线段树
- string.empty , , null 以及性能的比较
- Git小技巧 - 指令别名及使用Beyond Compare作为差异比较工具
- 《软件测试技术》课程第二周随笔
- Python基础学习数值运算之内建函数
- python中正则表达式的默认匹配方式为_Python模式匹配与正则表达式
- linux命令行 基础,Linux命令行基础,关于Bash需要知道的一些常识
- mysql 大分页查询优化_Mysql骚操作:优化大分页查询