利用 Spring Aop 动态维护多数据源

一、回顾AOP

首先还是回顾下AOP的定义。

在百度百科中看到AOP是这样的一个定义。在软件业,AOP为Aspect Oriented Programming的缩写,

意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

这里总结为一句话:通过动态代理的方式来维护系统中无关业务的代码。

举个例子:在任何系统中,都会使用到事务。而事务是无关业务的代码,没有必要在每个业务部分进行相关的代码维护。即不符合复用的原则,也不好进行维护。所以一般的情况【非XA事务】,继承spring或使用注解,或使用配置文件来交给spring来维护即可,当然这里界定的都是在非分布式的单个spring容器内维护的事务。

二、配置多数据源

背景:

项目开发需要配置多个数据源。

  • 1.不同业务需要进行多数据源的维护

  • 2.相同业务需要进行数据源读写的维护

这里针对第二种情况进行说明,第一种情况类似。

基本思路:
  1. 通过自定义注解拦截在service层的方法
  2. 通过方法名或者在注解内的value值进行判定
  3. 继承spring内部的AbstractRoutingDataSource重写determineCurrentLookupKey方法来设定当前的数据源
自定义注解

RetentionPolicy.RUNTIME 运行时进行 ElementType.METHOD 方法拦截。使用枚举配合自定义注解,更利于维护。

数据源切面来具体m.getAnnotation(DataSource.class).value()来进行切换。这里其实也可以使用data.value()来进行正则匹配具体的方法,这样的情况可以减少在自定义注解上的配置。例如:可以配置符合select、query 等正则字符来进行选择数据源。

真正用来重写spring的动态路由的handler。实在是找不到一个中文词语能够代替这个handler,什么词都没有这个感觉。所以这里请允许我装一把。

其实最核心的配置就是这里了,其他的都是辅助这个来做的。包括还有aop的配置以及mybatis的xml扫描和基础的注解支持。

三、可能出现的问题

本文的数据源切换时通过结合spring以及dubbo来执行的,当程序运行一段时间后调用duboo服务时.会出现数据源切换失败的问题。

这里可以使用spring 的@order 注解将spring切换数据源的方法的使用优先级调整为-1。这时候就能够避免这个问题。

四、总结

最近工作的时候,感觉还是遇到瓶颈了。找不到方向和目标,只知道埋头苦干没有思考未来的路。有点转圈拉磨的感觉。让我想起温总理的一句话:仰望星空和脚踏实地。与君共勉。

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91439 人正在系统学习中

来源:柏修

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2016年10月13日
下一篇 2016年10月13日

相关推荐