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(); 
 | 
        } 
 | 
    } 
 | 
  
 | 
} 
 |