`
tonyJ
  • 浏览: 142300 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

spring mybatis多数据源切换(2)

 
阅读更多
在上一篇文章中写到,多数据源的切换是使用Java代码调用的,现在使用注解去做数据源的切换。
1、首先新建注解的类。
package com.winning.common.mybatis;

import java.lang.annotation.*;

/**
 * Created by TonyJ on 2019/6/12.
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented
public @interface DS {
    String value() default "dataSource";
}



2、创建切面的类
package com.winning.common.mybatis;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.Order;

import java.lang.reflect.Method;

/**
 * Created by TonyJ on 2019/6/12.
 */
@Order(1)
@Aspect
public class DynamicDataSourceAspect {

   //使用DS注解动作之后清除
   @After("@annotation(DS)")
   public void afterSwitchDS(JoinPoint point){
       System.out.println("清除当前数据源"+DataSourceContextHolder.getDbType());
       DataSourceContextHolder.clearDbType();
   }

    //使用DS注解动态切换
    @Before("@annotation(DS)")
    public void beforeSwitchDS(JoinPoint point){
        //获得当前访问的class
        Class<?> className = point.getTarget().getClass();
        //获得访问的方法名
        String methodName = point.getSignature().getName();
        //得到方法的参数的类型
        Class[] argClass = ((MethodSignature)point.getSignature()).getParameterTypes();
        String dataSource = "dataSource";
        try {
            // 得到访问的方法对象
            Method method = className.getMethod(methodName, argClass);
            // 判断是否存在@DS注解
            if (method.isAnnotationPresent(DS.class)) {
                DS annotation = method.getAnnotation(DS.class);
                // 取出注解中的数据源名
                dataSource = annotation.value();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("当前数据源"+dataSource);
        // 切换数据源
        DataSourceContextHolder.setDbType(dataSource);
    }


}


3、在xml文件增加切面类的配置
 <!-- 配置数据库注解aop -->
    <bean id="dataSourceAspect" class="com.winning.common.mybatis.DynamicDataSourceAspect" />

    <aop:config>
    <!--
        切割点:pointcut
            第一个*:任意返回值
            第二个*:类名(任意类)
            第三个*:方法名(任意方法)
            (..):0-n参数,类型任意
     -->
    <aop:pointcut id="pointCut" expression="execution(* com.winning.*.service.*.*(..))" />
    <!--切割注入事物 ,植入事务:advisor-->
    <aop:advisor advice-ref="txAdvice" pointcut-ref="pointCut"/>
    </aop:config>

4、在具体的方法上面调用
@Override
	@DS("dataSource2")
	public List<Map<String, Object>> querySyhjAllDatasByParams(
			Map<String, Object> params) throws Exception {
		return sysLogDao.querySyhjAllDatasByParams(params);
	}

5、调用类的正常使用:
package com.winning.dataservice;

import com.winning.common.mybatis.DataSourceContextHolder;
import com.winning.common.service.SysLogService;
import com.winning.common.web.annotator.RequestMap;
import com.winning.common.web.controller.AbstractController;
import com.winning.common.web.entity.MapAdapter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by TonyJ on 2019/6/5.
 */
@Controller
@RequestMapping("/test")
public class TestController extends AbstractController {

    @Autowired
    private SysLogService sysLogService;


    @RequestMapping(value = "list")
    public @ResponseBody
    Map list(@RequestMap MapAdapter mapAdapter, HttpServletRequest request, HttpServletResponse response) throws Exception {
        Map param= new HashMap();
        //注意这里在调用service前切换到dataSource22的数据源
        //DataSourceContextHolder.setDbType("dataSource2");
        List<Map> dataList = sysLogService.querySyhjAllDatasByParams(param);
        return dataList.get(0);
    }
}


6、调用结果展示




  • 大小: 10.7 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics