package com.dy.common.multiDataSource; 
 | 
  
 | 
  
 | 
import com.dy.common.contant.Constant; 
 | 
import com.dy.common.springUtil.SpringContextUtil; 
 | 
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 DataSourceSingleAspect { 
 | 
  
 | 
    @Pointcut("@annotation(com.dy.common.multiDataSource.DataSourceSingle)") 
 | 
    public void dataSourceSinglePointCut() { 
 | 
    } 
 | 
  
 | 
    @Around("dataSourceSinglePointCut()") 
 | 
    public Object around(ProceedingJoinPoint point) throws Throwable { 
 | 
        MethodSignature signature = (MethodSignature) point.getSignature(); 
 | 
        Method method = signature.getMethod(); 
 | 
        DataSourceSingle dataSource = method.getAnnotation(DataSourceSingle.class); 
 | 
  
 | 
        if (Objects.nonNull(dataSource) && !StringUtils.isNullOrEmpty(dataSource.value())) { 
 | 
            //log.info("数据源指定为" + dataSource.value()); 
 | 
            //强制转成方法上配置的数据源,替换掉DataSourceContext中保存的数据源 
 | 
            DataSourceContext.set(dataSource.value()); 
 | 
        }else{ 
 | 
            String datasourceName = SpringContextUtil.getApplicationContext().getEnvironment().getProperty("spring.datasource.names") ; 
 | 
            if(!StringUtils.isNullOrEmpty(datasourceName)){ 
 | 
                //log.info("根据配置数据源为" + datasourceName); 
 | 
                DataSourceContext.set(datasourceName); 
 | 
            }else{ 
 | 
                log.error("数据源未指定"); 
 | 
            } 
 | 
        } 
 | 
        try { 
 | 
            //log.info("数据库操作开始" + dataSource.value()); 
 | 
            return point.proceed(); 
 | 
        } finally { 
 | 
            // 销毁数据源 在执行方法之后 
 | 
            //log.info("数据源操作完毕" + dataSource.value()); 
 | 
            DataSourceContext.remove(); 
 | 
        } 
 | 
    } 
 | 
} 
 |