spring aop的兩種使用方式

@Aspect
// @Order(-1) // 保證切換數據源在@Transactional之前執行 ,因爲實現了Ordered 接口, 所以可以不需要註解
@Component
public class DataSourceAdvice implements MethodBeforeAdvice, AfterReturningAdvice, ThrowsAdvice, Ordered {

    private Logger logger = LoggerFactory.getLogger(DataSourceAdvice.class);

    @Override
    public void afterReturning(Object arg0, Method method, Object[] arg2, Object arg3) throws Throwable {

    }

    @Override
    public void before(Method method, Object[] arg1, Object target) throws Throwable {
        if (method.getDeclaringClass().getName().startsWith("com.xxx.take")) {
            DynamicallyDataSource.setDsType("xxxx");
        } else {
            DynamicallyDataSource.setDsType("ddddd");
        }
    }

    public void afterThrowing(Method method, Object[] args, Object target, Exception ex) throws Throwable {
        ex.printStackTrace();
        logger.error("-----error", ex.getMessage());
    }

    public int getOrder() {
        return -1;
    }
}

注意第一種方式需要手動注入

    @Bean
    @Order(5)
    public Advisor txAdviceAdvisor() {
        AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
        pointcut.setExpression("execution( 。。。。省略)");
        return new DefaultPointcutAdvisor(pointcut, new PremissionAop2());
    }

第二種方式

@Aspect
@Order(-1) // 保證切換數據源在@Transactional之前執行 
@Component
@Component
public class DataSourceAdvice  {

    private Logger logger = LoggerFactory.getLogger(DataSourceAdvice.class);

    @Pointcut("execution(public * com.xxx.service.*.*(..))")
     public void take() {
     logger.info("xxx");
     };

     @Before("take()")
     public void before(JoinPoint jp) {
         DataSourceContextHolder.setDsType("");
     }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章