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