package com.lyms.etl.datasource; import com.lyms.etl.util.ReflectUtil; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.lang.reflect.Method; /** * 动态切换数据源aop * @Author: litao * @Date: 2017/5/17 0017 10:48 * @Version: V1.0 */ @Aspect @Component //@Order(1) /** 保证在方法执行前执行 */ public class DynamicDataSourceAspect { private static final Logger logger = LoggerFactory.getLogger(DynamicDataSourceAspect.class); @Pointcut("@within(DynamicDataSourceAnno) || @annotation(DynamicDataSourceAnno)") private void advice() { } @Before("advice()") public void setDataSource(JoinPoint point) { try { Class clazz = point.getTarget().getClass(); MethodSignature signature = (MethodSignature) point.getSignature(); Method method = signature.getMethod(); /** 可能是通过接口调用方法 所以通过反射获取实现类方法上面的注解 */ DynamicDataSourceAnno anno = ReflectUtil.getMethodAnno(clazz, method.getName(), DynamicDataSourceAnno.class); if(anno == null) { /** 方法上沒注解获取类上面的注解 由于只拦截了类和方法上的注解 所以不可能为空 */ anno = clazz.getAnnotation(DynamicDataSourceAnno.class); } String datasource = anno.value(); if(DynamicDataSourceContextHolder.containsDataSource(datasource)) { DynamicDataSourceContextHolder.setDataSourceType(datasource); logger.info("切换到 [{}] 数据源", datasource); } else { logger.info("数据源 [{}] 未找到,使用默认数据源", datasource); } } catch (Exception e) { logger.error("切换数据源失败: ", e.fillInStackTrace()); } } }