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();
}

猜你喜欢

转载自www.cnblogs.com/chenggang816/p/13386887.html
今日推荐