一. 介绍
在 Spring 中,经常可以看到 Advice、Advisor、Advised 等接口,它们长的很像,经常容易搞混;但是它们是完全不同的东西,有着不同的功能;
理解这几个接口,能让我们更好的理解 Spring AOP,我们先简单介绍这几个接口;
- Advice:org.aopalliance.aop.Advice;
- 通知,表示 Aspect 在特定的 join point 采取的操作,包括 around、before、after 等;
- Pointcut:org.springframework.aop.Pointcut;
- 切点,它是用来匹配连接点 join point 的;一个 Pointcut 可以用来匹配一些 join point;
- Advisor:org.springframework.aop.Advisor;
- 通知者,它持有一个 Advice,注意是一个,它是 Spring AOP 的一个基础接口;
- Advised:org.springframework.aop.framework.Advised;
- AOP 代理工厂配置类接口,提供了操作和管理 Advice 和 Advisor 的能力;
- 这个类功能很广,很强大;任意 AOP 代理类对象都可以转换为 Advised 实例对象,这是因为 AOP 在生产代理类的时候会让代理类实现 Advised 接口;后续我们会探讨这个点;
二. 类图
三个接口类图如下:
- Advisor 可以获取到一个 Advice;
- PointcutAdvisor 继承了 Advisor,它可以获取到一个 Pointcut 和一个 Advisor;PointcutAdvisor 是一个功能完善的接口;
- Advised 是 AOP 代理工厂配置类接口,它可以操作和管理 Advice 和 Advisor,它的实现类有 ProxyConfig、ProxyFactory、AspectJProxyFactoty 等,用于生产 AOP 代理类;
三. Advice
Advice 接口如下,可以看到,Advice 只是一个接口,它没有任何方法;
public interface Advice {
}
Advice 类图全景如下,功能最强大的是 MethodInterceptor;
我们可以简单看下这个 MethodInterceptor;
@FunctionalInterface
public interface MethodInterceptor extends Interceptor {
/**
* invoke() 是核心方法,它有一个参数:MethodInvocation
* MethodInvocation 也很重要,后续我们也会遇到
*/
@Nullable
Object invoke(@Nonnull MethodInvocation invocation) throws Throwable;
}
Advice 大体上分为了三类:BeforeAdvice、MethodInterceptor、AfterAdvice;
可以看出,MethodInterceptor 是功能最强大的,它能够处理 BeforeAdvice、AroundAdvice、AfterAdvice、ThrowsAdvice、@Valid 方法参数校验、@Async 异步等;
四. Advisor
Advisor 接口如下;
public interface Advisor {
/**
* Common placeholder for an empty {@code Advice} to be returned from
* {@link #getAdvice()} if no proper advice has been configured (yet).
* @since 5.0
*/
Advice EMPTY_ADVICE = new Advice() {};
/**
* 持有一个 advice 对象
*/
Advice getAdvice();
}
Advisor 最常用的 Advisor 是 PointcutAdvisor,通过 PointcutAdvisor,可以获取到 Pointcut 和 Advice;
五. Advised
Advised 接口如下;
类图如下:
Advised 是 AOP 代理工厂配置类接口;
它的实现类有:ProxyConfig、AdvisedSupport、ProxyFactory;
Advised 提供了操作和管理 Advice 和 Advisor 的能力,所以,ProxyFactory 实现 Advised 之后,就可以方便的获取和操作 Advice、Advisor,从而创建 AOP 代理类了,并且任意 AOP 代理对象都可以转换为 Advised 实现类;