首页
技术小册
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 编程思想(上)
### Spring AOP Advice类型:Spring AOP丰富了哪些AOP Advice呢? 在深入探讨Spring AOP(面向切面编程)的核心概念时,理解不同类型的Advice(通知)是至关重要的一步。Advice定义了切面(Aspect)何时以及如何应用到目标对象的方法上,它是AOP框架中最具表现力的元素之一。Spring AOP作为Spring框架中集成AOP的轻量级解决方案,通过其丰富的Advice类型,为开发者提供了灵活且强大的能力来增强、修改或扩展现有代码的功能,而无需修改源代码。本章将详细阐述Spring AOP所支持的几种主要Advice类型,以及它们如何丰富和扩展了AOP的应用场景。 #### 1. 引言 在软件开发中,随着系统复杂度的增加,横切关注点(如日志记录、事务管理、安全控制等)的管理变得日益困难。AOP正是为了解决这类问题而诞生的技术,它允许开发者将横切关注点从业务逻辑中分离出来,形成独立的切面,并通过Advice与业务逻辑进行关联。Spring AOP通过其简单的配置和强大的功能,成为了Java企业应用中广泛采用的AOP解决方案。 #### 2. Spring AOP Advice类型概览 Spring AOP支持多种类型的Advice,每种类型都对应着不同的应用场景和生命周期阶段。以下是Spring AOP主要支持的几种Advice类型: ##### 2.1 前置通知(Before Advice) 前置通知是在目标方法执行之前执行的Advice。它主要用于执行一些前置的准备工作,如检查权限、记录日志开始时间等。通过实现`MethodBeforeAdvice`接口或使用`@Before`注解(在Spring AOP中使用AspectJ注解风格时),可以定义前置通知。 ```java @Aspect public class BeforeAdviceExample { @Before("execution(* com.example.service.*.*(..))") public void beforeAdvice() { System.out.println("前置通知:方法执行前执行"); } } ``` ##### 2.2 后置返回通知(After Returning Advice) 后置返回通知在目标方法正常执行完成后执行,但仅当方法成功完成时触发。它常用于处理返回值的后续操作,如修改返回值、记录日志结束时间等。通过实现`AfterReturningAdvice`接口或使用`@AfterReturning`注解可以定义后置返回通知。 ```java @Aspect public class AfterReturningAdviceExample { @AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result") public void afterReturningAdvice(Object result) { System.out.println("后置返回通知:方法执行后,返回值:" + result); } } ``` ##### 2.3 异常抛出通知(After Throwing Advice) 异常抛出通知在目标方法执行过程中抛出异常时执行。它主要用于异常处理,如记录异常信息、执行清理工作等。通过实现`ThrowsAdvice`接口(较少使用,因为注解方式更受欢迎)或使用`@AfterThrowing`注解可以定义异常抛出通知。 ```java @Aspect public class AfterThrowingAdviceExample { @AfterThrowing(pointcut = "execution(* com.example.service.*.*(..))", throwing = "ex") public void afterThrowingAdvice(Exception ex) { System.out.println("异常抛出通知:捕获到异常:" + ex.getMessage()); } } ``` ##### 2.4 最终通知(After Advice) 最终通知无论目标方法执行成功还是抛出异常,都会执行。它通常用于执行资源释放、日志记录等收尾工作。通过实现`AfterReturningAdvice`(实际上不是直接用于此目的,但更常用的是`@After`注解)或使用`@After`注解可以定义最终通知。 ```java @Aspect public class AfterAdviceExample { @After("execution(* com.example.service.*.*(..))") public void afterAdvice() { System.out.println("最终通知:方法执行后(无论成功还是异常)"); } } ``` ##### 2.5 环绕通知(Around Advice) 环绕通知是最强大的Advice类型,它可以在目标方法执行前后执行自定义逻辑,甚至可以决定是否执行目标方法本身以及替换返回值。环绕通知通过实现`MethodInterceptor`接口或使用`@Around`注解来定义。 ```java @Aspect public class AroundAdviceExample { @Around("execution(* com.example.service.*.*(..))") public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable { System.out.println("环绕通知:方法执行前"); try { Object result = pjp.proceed(); // 继续执行目标方法 System.out.println("环绕通知:方法执行后,返回值:" + result); return result; } catch (Throwable e) { System.out.println("环绕通知:捕获到异常:" + e.getMessage()); throw e; // 可选择重新抛出异常或处理异常 } } } ``` #### 3. Advice类型的应用场景与选择 - **前置通知**:适用于权限检查、日志记录、参数校验等前置准备工作。 - **后置返回通知**:适合处理返回值,如数据格式化、性能监控等。 - **异常抛出通知**:用于全局异常处理、日志记录等。 - **最终通知**:资源清理、日志记录等收尾工作,无论方法执行成功与否都会执行。 - **环绕通知**:当需要在方法执行前后进行复杂逻辑处理,或者需要控制方法的执行流程时,环绕通知是最灵活的选择。 在选择Advice类型时,应根据具体的业务需求和场景来决定。每种Advice类型都有其独特的用途和优势,合理地使用它们可以显著提高代码的可维护性和可扩展性。 #### 4. 总结 Spring AOP通过提供丰富多样的Advice类型,为开发者提供了强大的AOP编程能力。这些Advice类型不仅覆盖了方法执行的不同生命周期阶段,还允许开发者根据实际需求选择最合适的通知类型来应对各种横切关注点。通过合理利用这些Advice类型,开发者可以有效地将横切关注点从业务逻辑中解耦出来,使代码更加清晰、易于维护。在未来的软件开发中,随着系统复杂度的不断提升,Spring AOP及其Advice类型将继续发挥重要作用,助力开发者构建更加高效、可靠的应用程序。
上一篇:
Spring AOP设计目标:Spring AOP与 AOP框架之间的关系是竞争还是互补?
下一篇:
Spring AOP代理实现:为什么Spring Framework选择三种不同AOP实现?
该分类下的相关小册推荐:
Java必知必会-Maven初级
Java语言基础12-网络编程
Mybatis合辑3-Mybatis动态SQL
Java语言基础4-数组详解
Java并发编程
Java语言基础7-Java中的异常
Java必知必会-Maven高级
Java面试指南
Java语言基础3-流程控制
Mybatis合辑2-Mybatis映射文件
Java语言基础11-Java中的泛型
Java并发编程实战