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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM