Spring AOP 组件 (Advice, Advisor, Advised)

1. Advice, Advisor 和 Advised

Advice 表示增强,有多种增强类型 (BeforAdvice, AfterReturningAdvice 等)

package org.aopalliance.aop;
public interface Advice {
}

Advisor 持有 Advice

public interface Advisor {
    Advice EMPTY_ADVICE = new Advice() {};

    Advice getAdvice();

    boolean isPerInstance();
}

Advised 是 AOP 代理工厂配置类接口,提供操作和管理 Advice 和 Advisor 的能力

public interface Advised extends TargetClassAware {
    // ...
    Advisor[] getAdvisors();
    void addAdvisor(Advisor advisor) throws AopConfigException;

    void addAdvice(Advice advice) throws AopConfigException;
}

2. Advice (增强)

@Configuration
public class BusinessInterceptorConfig {

    @Bean
    public Advice loginInterceptor() {
        return new LoginInterceptor();
    }
}
@Slf4j
public class LoginInterceptor implements MethodInterceptor {
    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        log.info(this.getClass().getSimpleName() + "; " + invocation.getMethod().getName());
        return invocation.proceed();
    }
}

3. Advisor(通知器)

  • 连接 Advice 和 Pointcut
@Configuration
public class BusinessInterceptorConfig {
    @Bean
    public Advisor businessAdvisor() {
        MyInterceptor myInterceptor = new MyInterceptor();
        DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor();
        AnnotationMatchingPointcut pointcut = new AnnotationMatchingPointcut(null, InterceptAnno.class, true);
        advisor.setPointcut(pointcut);
        advisor.setAdvice(myInterceptor);
        return advisor;
    }
}

或者

@Configuration
public class MyInterceptorConfig {
    @Bean
    public Advice myInterceptor() {
        return new MyInterceptor();
    }

    @Bean
    public Advisor pointcutAdvisor() {
        DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor();
        // 设置 checkInherited = true
        // AnnotationMatchingPointcut pointcut = new AnnotationMatchingPointcut(null, InterceptAnno.class, true);
        AnnotationMatchingPointcut pointcut = new AnnotationMatchingPointcut(InterceptAnno.class, true);
        advisor.setPointcut(pointcut);
        advisor.setAdvice(myInterceptor());
        return advisor;
    }
}

【信息由网络或者个人提供,如有涉及版权请联系COOY资源网邮箱处理】

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容