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