Spring 配置多数据源实现

本文介绍如何在Spring中配置多数据源,包括通过自定义注解和AOP技术实现数据源的动态切换,以及核心组件DynamicDataSource的具体实现。

Spring 配置多数据源原理



要使用的技术,我们先看下annotation的定义:

  1. @Retention(RetentionPolicy.RUNTIME)  
  2. @Target(ElementType.METHOD)  
  3. public @interface DataSource {  
  4.     String value();  
  5. }  

 

    我们还需要实现spring的抽象类AbstractRoutingDataSource,就是实现determineCurrentLookupKey方法:

  1. public class DynamicDataSource extends AbstractRoutingDataSource {  
  2.   
  3.     @Override  
  4.     protected Object determineCurrentLookupKey() {  
  5.         // TODO Auto-generated method stub  
  6.         return DynamicDataSourceHolder.getDataSouce();  
  7.     }  
  8.   
  9. }  
  10.   
  11.   
  12. public class DynamicDataSourceHolder {  
  13.     public static final ThreadLocal<String> holder = new ThreadLocal<String>();  
  14.   
  15.     public static void putDataSource(String name) {  
  16.         holder.set(name);  
  17.     }  
  18.   
  19.     public static String getDataSouce() {  
  20.         return holder.get();  
  21.     }  
  22. }  

 


实现的核心部分,也就是AOP部分,DataSourceAspect定义如下:

  1. public class DataSourceAspect {  
  2.   
  3.     public void before(JoinPoint point)  
  4.     {  
  5.         Object target = point.getTarget();  
  6.         String method = point.getSignature().getName();  
  7.   
  8.         Class<?>[] classz = target.getClass().getInterfaces();  
  9.   
  10.         Class<?>[] parameterTypes = ((MethodSignature) point.getSignature())  
  11.                 .getMethod().getParameterTypes();  
  12.         try {  
  13.             Method m = classz[0].getMethod(method, parameterTypes);  
  14.             if (m != null && m.isAnnotationPresent(DataSource.class)) {  
  15.                 DataSource data = m  
  16.                         .getAnnotation(DataSource.class);  
  17.                 DynamicDataSourceHolder.putDataSource(data.value());  
  18.                 System.out.println(data.value());  
  19.             }  
  20.               
  21.         } catch (Exception e) {  
  22.             // TODO: handle exception  
  23.         }  
  24.     }  
  25. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江晓曼*凡云基地

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值