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