| package com.dy.common.multiDataSource; | 
|   | 
| import com.dy.common.contant.Constant; | 
| import com.mysql.cj.util.StringUtils; | 
| import lombok.extern.slf4j.Slf4j; | 
| import org.aspectj.lang.ProceedingJoinPoint; | 
| import org.aspectj.lang.annotation.Around; | 
| import org.aspectj.lang.annotation.Aspect; | 
| import org.aspectj.lang.annotation.Pointcut; | 
| import org.aspectj.lang.reflect.MethodSignature; | 
| import org.springframework.core.annotation.Order; | 
| import org.springframework.stereotype.Component; | 
|   | 
| import java.lang.reflect.Method; | 
| import java.util.Objects; | 
|   | 
| @Slf4j | 
| @Aspect | 
| @Order(Constant.AspectOrderDataSource) | 
| @Component | 
| public class DataSourceAspect { | 
|   | 
|     @Pointcut("@annotation(com.dy.common.multiDataSource.DataSource)") | 
|     public void dataSourcePointCut() { | 
|     } | 
|   | 
|     @Around("dataSourcePointCut()") | 
|     public Object around(ProceedingJoinPoint point) throws Throwable { | 
|         MethodSignature signature = (MethodSignature) point.getSignature(); | 
|         Method method = signature.getMethod(); | 
|         DataSource dataSource = method.getAnnotation(DataSource.class); | 
|   | 
|         if (Objects.nonNull(dataSource) && !StringUtils.isNullOrEmpty(dataSource.value())) { | 
|             log.info("切换数据源为" + dataSource.value()); | 
|             //强制转成方法上配置的数据源,替换掉DataSourceContext中保存的数据源 | 
|             DataSourceContext.set(dataSource.value()); | 
|         }else{ | 
|             String dataSourceName = DataSourceContext.get() ; | 
|             if(!StringUtils.isNullOrEmpty(dataSourceName)){ | 
|                 log.info("当前数据源为" + dataSourceName); | 
|             } | 
|         } | 
|   | 
|         try { | 
|             log.info("数据库操作开始" + dataSource.value()); | 
|             return point.proceed(); | 
|         } finally { | 
|             // 销毁数据源 在执行方法之后 | 
|             log.info("数据源操作完毕" + dataSource.value()); | 
|             DataSourceContext.remove(); | 
|         } | 
|     } | 
|   | 
| } |