package com.ruoyi.framework.aspectj; 
 | 
  
 | 
import java.util.Objects; 
 | 
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.slf4j.Logger; 
 | 
import org.slf4j.LoggerFactory; 
 | 
import org.springframework.core.annotation.AnnotationUtils; 
 | 
import org.springframework.core.annotation.Order; 
 | 
import org.springframework.stereotype.Component; 
 | 
import com.ruoyi.common.annotation.DataSource; 
 | 
import com.ruoyi.common.utils.StringUtils; 
 | 
import com.ruoyi.framework.datasource.DynamicDataSourceContextHolder; 
 | 
  
 | 
/** 
 | 
 * 多数据源处理 
 | 
 *  
 | 
 * @author ruoyi 
 | 
 */ 
 | 
@Aspect 
 | 
@Order(1) 
 | 
@Component 
 | 
public class DataSourceAspect 
 | 
{ 
 | 
    protected Logger logger = LoggerFactory.getLogger(getClass()); 
 | 
  
 | 
    @Pointcut("@annotation(com.ruoyi.common.annotation.DataSource)" 
 | 
            + "|| @within(com.ruoyi.common.annotation.DataSource)") 
 | 
    public void dsPointCut() 
 | 
    { 
 | 
  
 | 
    } 
 | 
  
 | 
    @Around("dsPointCut()") 
 | 
    public Object around(ProceedingJoinPoint point) throws Throwable 
 | 
    { 
 | 
        DataSource dataSource = getDataSource(point); 
 | 
  
 | 
        if (StringUtils.isNotNull(dataSource)) 
 | 
        { 
 | 
            DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().name()); 
 | 
        } 
 | 
  
 | 
        try 
 | 
        { 
 | 
            return point.proceed(); 
 | 
        } 
 | 
        finally 
 | 
        { 
 | 
            // 销毁数据源 在执行方法之后 
 | 
            DynamicDataSourceContextHolder.clearDataSourceType(); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取需要切换的数据源 
 | 
     */ 
 | 
    public DataSource getDataSource(ProceedingJoinPoint point) 
 | 
    { 
 | 
        MethodSignature signature = (MethodSignature) point.getSignature(); 
 | 
        DataSource dataSource = AnnotationUtils.findAnnotation(signature.getMethod(), DataSource.class); 
 | 
        if (Objects.nonNull(dataSource)) 
 | 
        { 
 | 
            return dataSource; 
 | 
        } 
 | 
  
 | 
        return AnnotationUtils.findAnnotation(signature.getDeclaringType(), DataSource.class); 
 | 
    } 
 | 
} 
 |