首页
技术小册
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 编程思想(上)
### @AspectJ后置动作 - 三种After Advice之间的关系 在Spring AOP(面向切面编程)的广阔领域中,`@AspectJ`作为其核心注解技术之一,为开发者提供了强大的能力来横切关注点(cross-cutting concerns),如日志记录、事务管理、安全检查等,从而避免了在业务逻辑代码中直接嵌入这些非功能性代码,使得代码更加清晰、模块化和易于维护。在`@AspectJ`中,后置动作(After Advice)是几种不同类型的通知(Advice)之一,它们在目标方法执行的不同阶段被触发。本章节将深入探讨三种主要的After Advice类型——`@AfterReturning`、`@AfterThrowing`和`@After`(包括`@After`的别名`@Finally`),以及它们之间的关系和使用场景。 #### 一、After Advice概述 在Spring AOP中,After Advice是指在目标方法执行之后执行的代码块,但根据目标方法执行的结果(正常完成、抛出异常)或仅作为方法执行的必然结果(无论成功或失败),After Advice被细分为三种类型: 1. **@AfterReturning**:在目标方法正常完成后执行,可以访问目标方法的返回值(如果有的话)。 2. **@AfterThrowing**:在目标方法抛出异常后执行,可以访问抛出的异常对象。 3. **@After(或@Finally)**:无论目标方法执行成功还是抛出异常,都会执行。它不能访问目标方法的返回值或异常对象,但确保了代码的“最终执行”。 #### 二、三种After Advice的详细解析 ##### 2.1 @AfterReturning `@AfterReturning`通知用于在目标方法正常执行完毕后执行特定的逻辑。它通常用于需要基于方法返回值进行进一步处理的场景,比如记录返回值到日志、进行结果的校验或转换等。 ```java @Aspect @Component public class LoggingAspect { @AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result") public void logReturnValue(JoinPoint joinPoint, Object result) { System.out.println("Method " + joinPoint.getSignature().getName() + " returned: " + result); } } ``` 在上述示例中,`logReturnValue`方法会在任何`com.example.service`包下的方法正常执行完毕后被调用,且可以访问到这些方法的返回值。 ##### 2.2 @AfterThrowing `@AfterThrowing`通知用于在目标方法抛出异常时执行特定的逻辑。这对于异常处理、日志记录或执行回滚操作等场景非常有用。 ```java @Aspect @Component public class ExceptionHandlingAspect { @AfterThrowing(pointcut = "execution(* com.example.service.*.*(..))", throwing = "ex") public void handleException(JoinPoint joinPoint, Throwable ex) { System.out.println("Method " + joinPoint.getSignature().getName() + " threw an exception: " + ex.getMessage()); } } ``` 这里,`handleException`方法会在`com.example.service`包下的任何方法抛出异常时被调用,并可以访问到抛出的异常对象。 ##### 2.3 @After(或@Finally) `@After`(或等价地,`@Finally`,尽管`@Finally`并非Spring AOP的官方注解,但概念上等同于`@After`)通知确保了无论目标方法执行成功还是失败,都会执行指定的逻辑。这通常用于执行清理工作、释放资源或记录方法调用的结束等。 ```java @Aspect @Component public class CleanupAspect { @After("execution(* com.example.service.*.*(..))") public void doCleanup(JoinPoint joinPoint) { System.out.println("Method " + joinPoint.getSignature().getName() + " executed."); // 执行清理逻辑 } } ``` `doCleanup`方法会在`com.example.service`包下的所有方法执行完毕后执行,无论这些方法是否成功或抛出了异常。 #### 三、三种After Advice之间的关系 ##### 3.1 互补性 三种After Advice类型在功能上互补,共同构成了Spring AOP中处理目标方法执行后逻辑的全面框架。`@AfterReturning`关注于成功执行后的处理,`@AfterThrowing`关注于异常处理,而`@After`(或`@Finally`)则提供了无论结果如何都必须执行的逻辑处理。 ##### 3.2 优先级与执行顺序 虽然Spring AOP没有明确定义这些Advice之间的执行优先级,但它们的执行顺序通常是基于它们被拦截的方法的退出点来决定的。首先,如果方法正常完成,`@AfterReturning`会被执行(如果有的话)。如果方法抛出异常,则跳过`@AfterReturning`,直接执行`@AfterThrowing`(如果有定义)。无论方法执行成功还是失败,`@After`(或`@Finally`)总是会被执行。 ##### 3.3 场景应用 - **日志记录**:`@AfterReturning`用于记录成功执行的方法及其返回值;`@AfterThrowing`用于记录方法执行过程中抛出的异常;`@After`用于记录所有方法调用的结束,无论成功与否。 - **资源清理**:`@After`(或`@Finally`)特别适用于资源清理工作,如关闭数据库连接、释放文件句柄等,确保即使在发生异常时也能正确释放资源。 - **异常处理**:`@AfterThrowing`是处理异常逻辑的理想选择,可以基于异常类型执行不同的恢复或回滚操作。 #### 四、总结 在Spring AOP中,`@AfterReturning`、`@AfterThrowing`和`@After`(或`@Finally`)三种After Advice类型各自扮演着不同的角色,共同构成了处理目标方法执行后逻辑的强大机制。它们之间的关系体现在功能上的互补性、执行顺序上的自然衔接以及在不同场景下的灵活应用。通过合理组合使用这些Advice类型,开发者可以构建出既高效又易于维护的切面逻辑,从而进一步提升应用程序的模块化和可维护性。
上一篇:
API实现Before Advice
下一篇:
XML配置三种After Advice
该分类下的相关小册推荐:
Java语言基础16-JDK8 新特性
Java语言基础2-运算符
经典设计模式Java版
Mybatis合辑3-Mybatis动态SQL
Mybatis合辑5-注解、扩展、SQL构建
Java语言基础3-流程控制
java源码学习笔记
Java必知必会-Maven初级
Java语言基础5-面向对象初级
Java必知必会-JDBC
深入拆解 Java 虚拟机
Java语言基础11-Java中的泛型