【Spring源码三千问】Advice、Advisor、Advised都是什么接口?
版本约定
Spring 5.3.9 (通过 SpringBoot 2.5.3 间接引入的依赖)
正文
-
Advice: org.aopalliance.aop.Advice- “通知”,表示 Aspect 在特定的 Join point 采取的操作。包括 “around”, “before” and “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 的能力。
下面我们通过类的继续关系图的方式,来从一个比较高的视角来观察一下 Advice、Advisor、Advised 接口。
通过类图,能让我们有一个全面的了解,而不是钻进某一个类里面,只见树木,不见森林!
Advice、Advisor、Advised 类图

- Advisor 可以获取到 Advice。
- PointcutAdvisor 可以获取到 Pointcut 和 Advice。Pointcut 可以匹配 join point,Advice 是具体的通知,所以,PointcutAdvisor 是一个功能完善接口。
- Advised 是 AOP 代理工厂配置类接口,它可以操作和管理 Advice 和 Advisor,它的实现类有 ProxyFactory、AspectJProxyFactory,用于生成AOP 代理类。

Advice

Advice 大体上分为了三类:BeforeAdvice、MethodInterceptor、AfterAdvice
可以看出,MethodInterceptor 是功能最强大的,它能够处理 BeforeAdvice、AroundAdvice、AfterAdvice、ThrowsAdvice、@Valid方法参数校验、@Async异步等。
MethodInterceptor

MethodInterceptor 除了可以处理 Advice 类的通知拦截外,还是一个比较能实用的方法拦截接口。
例如:给接口 FooService 添加一个方法拦截器
FooService fooService = ProxyFactory.getProxy(FooService.class, new MyInterceptor());
在执行 FooService 的任意方法时,都会经过 MyInterceptor 的处理。
ProxyFactory#getProxy(Class, Interceptor)
它可以为给定接口和 Interceptor 拦截器创建代理类。
这个方法是一个静态方法,可以给单个 Interceptor 拦截器创建代理,这个拦截器自己处理所有的调用,而不是委托给目标(如远程调用代理)。
public static t T getProxy(Classt proxyInterface, Interceptor interceptor) {
return (T) new ProxyFactory(proxyInterface, interceptor).getProxy();
}
Advisor

Advisor 大体分为了三类:PointcutAdvisor、IntroductionAdvisor、PrototypePlaceholderAdvisor
其中,用到的最多的就是 PointcutAdvisor,它涵盖了绝大部分的 Advisor。
PointcutAdvisor
PointcutAdvisor 是一个功能完善接口,也是 Spring AOP 中使用最多的,它涵盖了绝大部分的 Advisor。
通过 PointcutAdvisor 可以获取到 Pointcut 和 Advice。Pointcut 可以完成 join point 的匹配,而 Advice 就是在 join point 上具体要执行的"通知"。
Advised


Advised 是 AOP 代理工厂配置类接口。
它的实现类有:ProxyFactory、AspectJProxyFactory、ProxyFactoryBean。
Advised 提供了操作和管理 Advice 和 Advisor 的能力,所以,ProxyFactory 实现 Advised 之后,就可以方便的获取和操作 Advice、Advisor,从而创建 AOP 代理类了。
Advised、ProxyConfig、AdvisedSupport 都是跟 Spring AOP 代理配置相关的接口和类,它们可以统一 Spring AOP 的代理配置。
小结
Advice、Advisor、Advised 都是 Spring AOP 相关的基本接口,理解这些接口的作用,对于更好的理解 Spring AOP 有很大的好处:
- Advice:
org.aopalliance.aop.Advice“通知”,表示 Aspect 在特定的 Join point 采取的操作。包括 “around”, “before” and “after 等
Advice 大体上分为了三类:BeforeAdvice、MethodInterceptor、AfterAdvice
MethodInterceptor 是功能最强大的,是一个通用的方法拦截接口,它能够处理 BeforeAdvice、AroundAdvice、AfterAdvice、ThrowsAdvice、@Valid方法参数校验、@Async异步等 - Advisor:
org.springframework.aop.Advisor“通知者”,它持有 Advice,是 Spring AOP 的一个基础接口。
它的子接口 PointcutAdvisor 是一个功能完善接口,它涵盖了绝大部分的 Advisor。 - Advised:
org.springframework.aop.framework.AdvisedAOP 代理工厂配置类接口。提供了操作和管理 Advice 和 Advisor 的能力。它的实现类 ProxyFactory 是 Spring AOP 主要用于创建 AOP 代理类的核心类。
原文:
版权声明:本文为CSDN博主「老王学源码」的原创文章,遵循CC 4.0 BY-SA版权协议