aop切换dynamicdatasource 动态数据源

233 阅读1分钟

问题

项目已经使用dynamicdatasource 来按照业务分日常数据的分库和大表通过sharingjdbc来分库, 想尽量少改动代码的条件下实现分库逻辑。。

` import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component;

import java.util.Arrays; import java.util.List;

@Component @Aspect @Order(0) @EnableAspectJAutoProxy(proxyTargetClass = true) public class DynamicDataSourceAspect {

/** 查询方法名前缀 **/
private final List<String> READ_PREFIX = Arrays.asList("query", "select", "get", "find");
        @Around("execution(* com.jj.s*.*.*(..)) "
        + "&& !@annotation(com.baomidou.dynamic.datasource.annotation.DS)")
public Object doAround(ProceedingJoinPoint jp) throws Throwable {
    String methodName = jp.getSignature().getName();
    Object result=null;
    if(isReadMethod(methodName)){
        //切换数据源
            DynamicDataSourceContextHolder.push(DBTypeEnum.slave.getValue());
            result = jp.proceed();
            DynamicDataSourceContextHolder.clear();

    }else{
        result = jp.proceed();
    }
    return result;
}

public boolean isReadMethod(String methodName){
    for(String prefix : READ_PREFIX){
        if(methodName.startsWith(prefix)){
            return true;
        }
    }
    return false;
}

}```