首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
AOP引入:OOP存在哪些局限性?
AOP常见使用场景
AOP概念:Aspect、Join Point和Advice等术语应该如何理解?
Java AOP设计模式:代理、判断和拦截器模式
Java AOP代理模式(Proxy):Java静态代理和动态代理的区别是什么?
Java AOP判断模式(Predicate):如何筛选Join Point?
Java AOP拦截器模式(Interceptor):拦截执行分别代表什么?
Spring AOP 功能概述:核心特性、编程模型和使用限制
Spring AOP编程模型:注解驱动、XML配置驱动和底层API
Spring AOP设计目标:Spring AOP与 AOP框架之间的关系是竞争还是互补?
Spring AOP Advice类型:Spring AOP丰富了哪些AOP Advice呢?
Spring AOP代理实现:为什么Spring Framework选择三种不同AOP实现?
JDK动态代理:为什么Proxy.newProxyInstance会生成新的字节码?
CGLIB动态代理:为什么Java动态代理无法满足AOP的需要?
AspectJ代理代理:为什么Spring推荐AspectJ注解?
AspectJ基础:Aspect、Join Points、Pointcuts和Advice语法和特性
AspectJ注解驱动:注解能完全替代AspectJ语言吗?
Spring核心基础:《小马哥讲Spring核心编程思想》还记得多少?
@AspectJ注解驱动
编程方式创建 @AspectJ代理
XML配置驱动 - 创建AOP代理
标准代理工厂API - ProxyFactory
@AspectJ Pointcut指令与表达式:为什么Spring只能有限支持?
XML配置Pointcut
API实现Pointcut
@AspectJ拦截动作:@Around与@Pointcut有区别吗?
XML配置Around Advice
API实现Around Advice
@AspectJ前置动作:@Before与@Around谁优先级执行?
XML配置Before Advice
API实现Before Advice
@AspectJ后置动作 - 三种After Advice之间的关系?
XML配置三种After Advice
API实现三种After Advice
自动动态代理
替换TargetSource
Spring AOP API整体设计
接入点接口 - Joinpoint
Joinpoint条件接口 - Pointcut
Pointcut操作 - ComposablePointcut
Pointcut便利实现
Pointcut AspectJ实现 - AspectJExpressionPointcut
Joinpoint执行动作接口 - Advice
Joinpoint Before Advice标准实现
Joinpoint Before Advice AspectJ实现
Joinpoint After Advice标准实现
Joinpoint After Advice AspectJ实现
Advice容器接口 - Advisor
Pointcut与Advice连接器 - PointcutAdvisor
Introduction与Advice连接器 - IntroductionAdvisor
Advisor的Interceptor适配器 - AdvisorAdapter
AdvisorAdapter实现
AOP代理接口 - AopProxy
AopProxy工厂接口与实现
JDK AopProxy实现 - JdkDynamicAopProxy
当前位置:
首页>>
技术小册>>
Spring AOP 编程思想(上)
小册名称:Spring AOP 编程思想(上)
### AdvisorAdapter实现 在Spring AOP(面向切面编程)的广阔领域中,`AdvisorAdapter`是实现切面编程机制的关键组件之一,它充当了连接点(Joinpoint)与通知(Advice)之间的桥梁,确保了不同类型的通知能够正确且高效地应用于目标对象的方法执行过程中。本章将深入探讨`AdvisorAdapter`的实现原理、作用、以及在Spring AOP框架中的具体应用,帮助读者更好地理解Spring AOP的灵活性和强大功能。 #### 一、引言 Spring AOP通过动态代理技术(JDK动态代理或CGLIB代理)在运行时对目标对象的方法进行拦截和增强,这一过程依赖于多个核心组件的协同工作,其中`Advisor`(顾问)和`AdvisorAdapter`(顾问适配器)扮演着至关重要的角色。`Advisor`封装了切面的定义,包括切点(Pointcut)和通知(Advice),而`AdvisorAdapter`则负责将`Advisor`中的通知适配到具体的拦截器链中,确保通知能够正确执行。 #### 二、AdvisorAdapter的作用 在Spring AOP中,`Advisor`是一个接口,它定义了切点和通知的关联方式。然而,由于Spring AOP支持多种类型的通知(如前置通知、后置通知、环绕通知等),每种通知的执行逻辑和时机各不相同,因此需要一个机制来将这些不同类型的通知适配到统一的拦截器链中。这就是`AdvisorAdapter`的作用所在。 `AdvisorAdapter`的主要职责包括: 1. **识别通知类型**:根据`Advisor`中配置的通知类型,选择合适的适配器来处理。 2. **适配通知到拦截器**:将`Advice`适配为Spring AOP内部使用的拦截器形式,确保通知能够在方法调用前后或异常时正确执行。 3. **维护拦截器链**:在Spring AOP的拦截器链中,`AdvisorAdapter`负责将适配后的拦截器按照一定顺序加入到链中,以支持多个切面的组合应用。 #### 三、AdvisorAdapter的实现细节 ##### 1. 接口定义 在Spring框架中,`AdvisorAdapter`接口(或其变体,如`AdvisorAdapterRegistry`)并不直接暴露给用户,而是作为内部机制存在。尽管如此,我们可以通过分析Spring AOP的源代码来理解其实现原理。 ```java // 假设的AdvisorAdapter接口定义 interface AdvisorAdapter { boolean supportsAdvice(Advice advice); MethodInterceptor getInterceptor(Advisor advisor); } ``` - `supportsAdvice(Advice advice)`:判断该适配器是否支持指定的通知类型。 - `getInterceptor(Advisor advisor)`:根据`Advisor`生成相应的`MethodInterceptor`,这是Spring AOP内部使用的拦截器接口。 ##### 2. 适配器实现 Spring AOP为每种类型的通知都提供了相应的适配器实现,如`MethodBeforeAdviceAdapter`、`AfterReturningAdviceAdapter`、`ThrowsAdviceAdapter`等。这些适配器通过实现`AdvisorAdapter`接口(或继承自实现了该接口的类),将不同类型的通知适配为`MethodInterceptor`。 以`MethodBeforeAdviceAdapter`为例,其实现可能如下: ```java class MethodBeforeAdviceAdapter implements AdvisorAdapter { @Override public boolean supportsAdvice(Advice advice) { return advice instanceof MethodBeforeAdvice; } @Override public MethodInterceptor getInterceptor(Advisor advisor) { return new MethodBeforeAdviceInterceptor(advisor.getAdvice()); } // 内部类,实现MethodInterceptor private static class MethodBeforeAdviceInterceptor implements MethodInterceptor { private final MethodBeforeAdvice advice; public MethodBeforeAdviceInterceptor(MethodBeforeAdvice advice) { this.advice = advice; } @Override public Object invoke(MethodInvocation invocation) throws Throwable { advice.before(invocation.getThis(), invocation.getMethod(), invocation.getArguments(), invocation.getTargetClass()); return invocation.proceed(); } } } ``` 在这个例子中,`MethodBeforeAdviceAdapter`通过检查`Advice`实例是否为`MethodBeforeAdvice`类型来判断是否支持该通知。如果支持,则创建一个`MethodBeforeAdviceInterceptor`,该拦截器在目标方法执行前调用`MethodBeforeAdvice`的`before`方法。 ##### 3. AdvisorAdapterRegistry 为了管理多个`AdvisorAdapter`,Spring AOP使用了`AdvisorAdapterRegistry`(或其类似实现)。这个注册表负责维护一个`AdvisorAdapter`列表,当需要适配通知时,遍历这个列表,找到第一个支持当前通知类型的适配器,并调用其`getInterceptor`方法获取拦截器。 #### 四、AdvisorAdapter在Spring AOP中的应用 在Spring AOP的实际应用中,开发者通常不需要直接编写`AdvisorAdapter`的代码,因为Spring已经为常见的通知类型提供了预定义的适配器。但是,理解`AdvisorAdapter`的工作原理对于深入理解Spring AOP的运行机制、进行高级定制或解决复杂问题具有重要意义。 例如,在自定义通知类型时,开发者可能需要编写自己的`AdvisorAdapter`来实现特定的适配逻辑。此外,在某些复杂的切面应用中,理解`AdvisorAdapter`如何维护拦截器链的顺序和完整性,对于保证切面逻辑的正确执行也至关重要。 #### 五、总结 `AdvisorAdapter`作为Spring AOP中的一个关键组件,通过将不同类型的通知适配为统一的拦截器形式,并维护拦截器链的完整性和顺序,确保了Spring AOP的灵活性和强大功能。理解`AdvisorAdapter`的实现原理和应用方式,对于掌握Spring AOP的精髓、进行高效的切面编程具有重要意义。 通过本章的探讨,我们深入了解了`AdvisorAdapter`的作用、实现细节以及在Spring AOP中的应用,希望这些内容能够帮助读者更好地理解和使用Spring AOP,从而在软件开发中发挥更大的作用。
上一篇:
Advisor的Interceptor适配器 - AdvisorAdapter
下一篇:
AOP代理接口 - AopProxy
该分类下的相关小册推荐:
Java语言基础13-类的加载和反射
Mybatis合辑4-Mybatis缓存机制
Mybatis合辑3-Mybatis动态SQL
深入理解Java虚拟机
Java并发编程
SpringBoot零基础到实战
JAVA 函数式编程入门与实践
Java语言基础2-运算符
Mybatis合辑1-Mybatis基础入门
Java语言基础15-单元测试和日志技术
Java语言基础9-常用API和常见算法
Java语言基础14-枚举和注解