Spring AOP 拦截注解接口的所有方法

背景:MyBatis多数据源切换问题,希望通过注解标注Dao类的数据源,但使用注解切点表达式,因实现类是MyBatis动态代理生成,无法在实现类上添加注解,而添加到接口上又无效,需要寻找替代方案。

解决方案:不采用AspectJ表达式方式定义切点和切面,使用 AnnotationMatchingPointcut 和 DefaultPointcutAdvisor 来定义。

示例代码如下,将Dao注解添加到接口上,即可拦截实现类的方法。

@Component
@Slf4j
public class DataSourceAspect {

    @Bean
    public Advisor dataSourceAdvisor(){
        Pointcut pointcut = new AnnotationMatchingPointcut(Dao.class, true);
        Advice advice = new MethodAroundAdvice();

        return new DefaultPointcutAdvisor(pointcut, advice);
    }

    private static class MethodAroundAdvice implements MethodBeforeAdvice, AfterReturningAdvice{

        @Override
        public void before(Method method, Object[] args, Object target) throws Throwable {
            log.info("before {} called", method.getName());
        }

        @Override
        public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
            log.info("after {} called", method.getName());
        }
    }

}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Dao {
    /**
     * 数据源
     * @return
     */
    String value();
}

 

posted @ 2020-07-27 18:16  codercg  阅读(7742)  评论(6编辑  收藏  举报