Spring AOP 攔截註解介面的所有方法
阿新 • • 發佈:2020-07-27
背景: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 publicvoid 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(); }