AopShardingHolder.java 1.81 KB
Newer Older
eddie.woo's avatar
eddie.woo committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
package pwc.taxtech.atms.common.datasource;

import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

@Component
@Aspect
public class AopShardingHolder {
    private static Logger logger = LoggerFactory.getLogger(AopShardingHolder.class);

    private static final String DATABASE_NAME_HEADER = "from";
    private static final String DATABASE_NAME_SPLIT = "@";
    @Autowired
    HttpServletRequest request;

    @Pointcut("execution(public * pwc.taxtech.atms.controller.*.*(..))")
    public void pointCut() {
        // 定义Pointcut 此方法不能有返回值,该方法只是一个标示
    }

    @Before("pointCut()")
    public void before(JoinPoint joinPoint) {
        try {
            String header = request.getHeader(DATABASE_NAME_HEADER);
            if (StringUtils.isNotBlank(header)) {
                if (logger.isDebugEnabled()) {
                    logger.debug("aop set datasource:{}", header);
                }
                String[] arr = StringUtils.split(header, DATABASE_NAME_SPLIT);
                String name = arr[0];
                if (name.length() > 0 && !StringUtils.contains(name, DATABASE_NAME_SPLIT)) {
                    ShardingContextHolder.setDataSourceKey(name);
                }
            }
        } catch (Exception e) {
            logger.error("aop set database error.", e);
        }
    }

    @After("pointCut()")
    public void after(JoinPoint joinPoint) {
    }

    @AfterThrowing(pointcut = "pointCut()", throwing = "error")
    public void afterThrowing(JoinPoint joinPoint, Throwable error) {

    }

}