首页
技术小册
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拦截动作:@Around与@Pointcut的区别与协同 在Spring AOP(面向切面编程)的广阔领域中,`@AspectJ` 注解为我们提供了一种强大而灵活的方式来定义切面(Aspects)、增强(Advices)以及切入点(Pointcuts)。其中,`@Around` 和 `@Pointcut` 是两个核心注解,它们在实现复杂业务逻辑解耦、横切关注点(Cross-cutting Concerns)如日志、事务管理、安全验证等方面发挥着至关重要的作用。然而,尽管它们经常一起使用,但它们在功能和作用上有着本质的区别。本章节将深入探讨 `@Around` 和 `@Pointcut` 的区别,以及它们如何协同工作以实现更高效的AOP编程。 #### 一、@Pointcut:定义切入点的利器 **定义与用途** `@Pointcut` 是AspectJ中用于定义一个切入点表达式的注解。切入点表达式决定了哪些连接点(Join Points)将被拦截,进而可以被相应的增强(Advice)所应用。简而言之,`@Pointcut` 是用来指定“在哪里”进行增强的。它本身并不包含增强的逻辑,而是为后续的增强提供了一个可重用的定位器。 **语法与示例** ```java @Aspect public class LoggingAspect { // 定义一个切入点,匹配所有返回类型为String的方法 @Pointcut("execution(* com.example.service.*.*(..)) && return(String)") public void serviceLayerExecution() {} // 其他增强逻辑... } ``` 在上面的例子中,`serviceLayerExecution` 是一个切入点表达式,它匹配了`com.example.service`包下所有类的所有方法,且这些方法返回类型为`String`。注意,`@Pointcut` 注解的方法体是空的,因为它仅用于定义切入点,不执行任何操作。 **特点与优势** - **可重用性**:一旦定义了切入点,就可以在多个增强中引用,避免了重复编写复杂的表达式。 - **灵活性**:支持多种表达式类型(如execution, within, args等),允许精确控制哪些连接点被拦截。 - **清晰性**:将切入点定义与增强逻辑分离,使得切面更加模块化,易于理解和维护。 #### 二、@Around:环绕增强的全能选手 **定义与用途** `@Around` 是AspectJ中用于定义环绕增强的注解。环绕增强是AOP中最强大的增强类型之一,因为它能够在目标方法执行前后、异常抛出时以及最终返回时执行代码。它允许你完全控制目标方法的执行流程,包括是否执行目标方法本身、修改返回值或抛出新的异常。 **语法与示例** ```java @Aspect public class LoggingAspect { @Pointcut("execution(* com.example.service.*.*(..))") public void serviceLayerExecution() {} @Around("serviceLayerExecution()") public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable { long startTime = System.currentTimeMillis(); try { System.out.println("Before method: " + joinPoint.getSignature().getName()); // 执行目标方法 Object result = joinPoint.proceed(); System.out.println("After method: " + joinPoint.getSignature().getName()); return result; } catch (IllegalArgumentException e) { System.out.println("Exception in method: " + joinPoint.getSignature().getName()); throw e; } finally { long endTime = System.currentTimeMillis(); System.out.println("Method took: " + (endTime - startTime) + "ms"); } } } ``` 在上面的例子中,`logAround` 方法是一个环绕增强,它使用了之前定义的 `serviceLayerExecution` 切入点。通过 `ProceedingJoinPoint` 对象,`logAround` 方法能够控制目标方法的执行,并在执行前后进行日志记录。 **特点与优势** - **全面控制**:环绕增强提供了对目标方法执行流程的完全控制,包括是否调用目标方法、修改返回值或处理异常。 - **灵活性强**:由于可以在目标方法执行前后及异常处理中插入自定义逻辑,因此非常适用于需要精细控制执行流程的场景。 - **性能考虑**:虽然功能强大,但过度使用环绕增强可能会对性能产生影响,因为每次调用都需要通过AOP代理进行。 #### 三、@Around与@Pointcut的区别 **功能定位** - `@Pointcut`:专注于定义切入点,即指定哪些连接点(通常是方法调用)将被拦截。它本身不包含任何增强逻辑,仅作为后续增强的定位器。 - `@Around`:是一种增强类型,用于在目标方法执行前后插入自定义逻辑,包括控制目标方法的执行流程。它依赖于切入点表达式来定位目标方法。 **使用场景** - `@Pointcut`:当你需要定义一组可重用的切入点表达式时,使用`@Pointcut`可以提高代码的可读性和可维护性。 - `@Around`:当你需要在目标方法执行前后执行复杂的逻辑,如日志记录、事务管理、安全检查等,并且这些逻辑可能需要根据目标方法的执行结果进行调整时,`@Around` 是一个理想的选择。 **协同工作** 在实际应用中,`@Pointcut` 和 `@Around` 经常协同工作。首先,通过`@Pointcut`定义切入点表达式,然后在`@Around`注解中引用这些表达式来指定增强的应用范围。这种组合方式不仅提高了代码的复用性,也使得AOP配置更加清晰和灵活。 #### 四、总结 `@Pointcut` 和 `@Around` 是Spring AOP中不可或缺的两个注解,它们在实现横切关注点方面发挥着重要作用。`@Pointcut` 通过定义切入点表达式,为后续的增强提供了定位依据;而`@Around` 则通过环绕增强的方式,在目标方法执行前后插入自定义逻辑,实现了对目标方法执行流程的精细控制。两者虽然功能不同,但相辅相成,共同构成了Spring AOP的强大能力。通过合理使用这两个注解,我们可以更加灵活地处理业务逻辑中的横切关注点,提升代码的可读性、可维护性和可扩展性。
上一篇:
API实现Pointcut
下一篇:
XML配置Around Advice
该分类下的相关小册推荐:
Java语言基础12-网络编程
深入拆解 Java 虚拟机
java源码学习笔记
Mybatis合辑4-Mybatis缓存机制
Spring AOP 编程思想(下)
Java语言基础3-流程控制
深入理解Java虚拟机
Java必知必会-Maven初级
Java语言基础10-Java中的集合
Java必知必会-JDBC
Java语言基础9-常用API和常见算法
Java语言基础16-JDK8 新特性