首页
技术小册
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 编程思想(上)
### 章节标题:Joinpoint执行动作接口 - Advice 在Spring AOP(面向切面编程)的广阔领域中,`Advice` 扮演着至关重要的角色,它定义了增强(或称为横切关注点)的具体行为,这些行为将被织入到目标对象的方法执行流程中的特定连接点(Joinpoint)上。本章将深入解析 `Advice` 的概念、类型、工作原理及其在Spring AOP中的应用,帮助您深入理解并灵活运用这一强大的编程范式。 #### 一、Advice 概览 在Spring AOP中,`Advice` 是指在执行目标对象方法前后(或异常时)所采取的动作或执行的代码块。它提供了一种机制,允许开发者在不修改目标对象源代码的情况下,为其增加额外的行为。这种机制对于处理日志记录、事务管理、安全检查等横切关注点尤为有效,极大地提高了代码的可维护性和复用性。 #### 二、Advice 的类型 Spring AOP 提供了多种类型的 `Advice`,每种类型都对应于方法执行的不同阶段或条件。以下是几种常见的 `Advice` 类型: 1. **Before Advice(前置通知)**: 在目标方法执行之前执行。它主要用于执行前置条件检查、资源准备等任务。例如,在调用服务方法之前验证用户权限。 2. **After Returning Advice(返回后通知)**: 在目标方法正常执行并返回结果后执行。它通常用于执行后处理逻辑,如记录方法执行时间、清理资源等。 3. **After Throwing Advice(异常后通知)**: 在目标方法抛出异常后执行。它用于处理异常情况,如记录错误信息、执行回滚操作等。 4. **After (Finally) Advice(最终通知)**: 无论目标方法执行成功还是抛出异常,都会在最后执行。它常用于释放资源、记录方法调用等场景。 5. **Around Advice(环绕通知)**: 最强大的 `Advice` 类型,它允许你在目标方法执行前后插入自定义行为,并控制目标方法的执行(通过调用 `ProceedingJoinPoint` 的 `proceed()` 方法)。环绕通知可以看作是前四种通知类型的超集,提供了最大的灵活性。 #### 三、Advice 的工作原理 `Advice` 的工作原理依赖于Spring AOP的两大核心概念:代理(Proxy)和连接点(Joinpoint)。当Spring容器启动时,它会根据配置信息为那些被指定了切面的Bean创建代理对象。这些代理对象会在调用目标对象的方法时,拦截(或称为织入)相应的连接点,并根据配置执行相应的 `Advice`。 1. **代理机制**: Spring AOP支持两种代理机制:JDK动态代理和CGLIB代理。对于实现了接口的类,Spring默认使用JDK动态代理;对于没有实现接口的类,则使用CGLIB代理。代理对象负责在调用目标方法时,插入 `Advice` 定义的额外行为。 2. **连接点匹配**: `Advice` 并不是直接作用于所有的方法调用,而是通过切点表达式(Pointcut Expression)来指定哪些连接点(即方法调用)应该被拦截。切点表达式定义了匹配连接点的规则,如方法名、参数类型、返回类型等。 3. **织入过程**: 当代理对象拦截到一个符合切点表达式的连接点时,它会根据配置的 `Advice` 类型,在连接点的适当位置执行相应的动作。例如,如果是前置通知,则会在目标方法执行之前执行通知代码;如果是环绕通知,则会完全控制目标方法的执行流程。 #### 四、Advice 的实现与配置 在Spring中,`Advice` 可以通过多种方式进行实现和配置,包括使用注解和XML配置。 1. **使用注解实现Advice**: Spring提供了`@Before`、`@AfterReturning`、`@AfterThrowing`、`@After`和`@Around`等注解,用于在方法上声明不同类型的通知。这些注解需要与目标方法(实际上是切面中的方法)结合使用,并通过`@Aspect`注解将该类标记为切面。 ```java @Aspect public class MyAspect { @Before("execution(* com.example.service.*.*(..))") public void beforeAdvice(JoinPoint joinPoint) { // 前置通知逻辑 } // 其他类型的通知... } ``` 2. **使用XML配置Advice**: 在早期的Spring版本中,或者当需要更细粒度的控制时,可以通过XML配置文件来定义切面和通知。这通常涉及到`<aop:aspect>`、`<aop:before>`、`<aop:after-returning>`等标签的使用。 ```xml <aop:config> <aop:aspect ref="myAspect"> <aop:before method="beforeAdvice" pointcut="execution(* com.example.service.*.*(..))"/> <!-- 其他类型的通知配置... --> </aop:aspect> </aop:config> ``` #### 五、Advice 的应用实例 假设我们需要为一个服务层的所有方法添加日志记录功能,我们可以使用Spring AOP的 `Advice` 来实现这一需求。以下是一个简单的示例: ```java @Aspect @Component public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore(JoinPoint joinPoint) { System.out.println("Before method: " + joinPoint.getSignature().getName()); } @AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result") public void logAfterReturning(JoinPoint joinPoint, Object result) { System.out.println("After method: " + joinPoint.getSignature().getName() + " returned " + result); } // 异常后通知和最终通知的实现... } ``` 在上述示例中,我们定义了一个切面 `LoggingAspect`,它包含了两个通知:`logBefore`(前置通知)和`logAfterReturning`(返回后通知)。这些通知通过切点表达式匹配服务层中的所有方法,并在这些方法执行前后执行相应的日志记录逻辑。 #### 六、总结 `Advice` 作为Spring AOP中的核心组件,为开发者提供了一种高效、灵活的方式来处理横切关注点。通过不同类型的通知和灵活的切点表达式,`Advice` 能够被精确地织入到目标对象的方法执行流程中,从而在不改变原有代码结构的情况下,增强系统的功能和可维护性。掌握 `Advice` 的使用,对于深入理解Spring AOP的精髓,以及在实际项目中应用AOP技术,都具有重要的意义。
上一篇:
Pointcut AspectJ实现 - AspectJExpressionPointcut
下一篇:
Joinpoint Before Advice标准实现
该分类下的相关小册推荐:
Java语言基础12-网络编程
Mybatis合辑5-注解、扩展、SQL构建
Java语言基础14-枚举和注解
Mybatis合辑3-Mybatis动态SQL
SpringBoot合辑-初级篇
经典设计模式Java版
Java语言基础16-JDK8 新特性
Java高并发秒杀入门与实战
Spring AOP 编程思想(下)
手把手带你学习SpringBoot-零基础到实战
Mybatis合辑1-Mybatis基础入门
Java必知必会-Maven高级