1. 程式人生 > 實用技巧 >Spring AOP 攔截註解介面的所有方法

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