首页
技术小册
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 编程思想(上)
### AOP概念:Aspect、Join Point和Advice等术语应该如何理解? 在深入探讨Spring AOP(面向切面编程)的精髓之前,理解其核心概念是至关重要的。AOP是一种编程范式,它允许开发者将横切关注点(cross-cutting concerns)从业务逻辑中分离出来,从而提高代码的重用性、模块性和可维护性。在本章中,我们将详细解析AOP中的几个核心概念:Aspect(切面)、Join Point(连接点)、Advice(通知)以及它们之间的关系,帮助读者建立起对AOP编程思想的全面认识。 #### 一、Aspect(切面) Aspect是AOP中最核心的概念之一,它是对横切关注点进行模块化的一种方式。在面向对象的编程中,我们通常会将具有相似职责的类组织在一起,形成模块或组件。然而,有些职责(如日志记录、事务管理、安全检查等)会横贯多个类或方法,这些就是所谓的横切关注点。Aspect正是为了解决这些横切关注点而设计的,它定义了一个跨越多个类或方法边界的关注点,允许我们在不修改源代码的情况下,为这些横切关注点提供统一的解决方案。 一个Aspect通常包含以下几个部分: - **Advice(通知)**:定义了Aspect要做什么,即在特定连接点(Join Point)上执行的动作。 - **Pointcut(切入点)**:定义了Advice应该应用到哪些连接点上,即一个或多个连接点的集合。虽然Pointcut不是直接由Aspect定义,但它是Aspect与Join Point之间的重要桥梁。 - **Join Points(连接点)**:在应用程序执行过程中,能够插入Advice的潜在点,如方法的执行、异常的抛出等。 #### 二、Join Point(连接点) Join Point是AOP中的一个基本概念,它指的是在应用程序执行过程中能够插入Advice的点。在Spring AOP中,Join Point主要指的是方法的执行点,包括方法的调用和执行返回。这意味着,每当一个方法被调用或执行完毕时,都可以视为一个Join Point,而Aspect可以在这些点上插入自己的逻辑。 值得注意的是,虽然Join Point在理论上可以是任何类型的程序执行点,但在实践中,大多数AOP框架(包括Spring AOP)都限制Join Point为方法调用,这是因为方法调用是应用程序中最常见的、也是最容易识别的横切关注点。 #### 三、Advice(通知) Advice是Aspect在特定Join Point上执行的动作,它定义了Aspect的“行为”。在Spring AOP中,Advice可以分为以下几种类型: 1. **Before Advice(前置通知)**:在目标方法执行前执行。 2. **After Returning Advice(返回后通知)**:在目标方法成功执行后执行。 3. **After Throwing Advice(异常后通知)**:在目标方法抛出异常后执行。 4. **After Advice(最终通知)**:无论目标方法执行结果如何(正常返回或抛出异常),都会在目标方法执行完毕后执行。 5. **Around Advice(环绕通知)**:在目标方法执行前后都可以执行自定义逻辑,并且可以决定是否继续执行目标方法或中断执行流程。 不同类型的Advice为Aspect提供了丰富的灵活性,使得开发者可以根据实际需要,在程序的执行流程中插入合适的逻辑。 #### 四、Aspect、Join Point和Advice之间的关系 Aspect、Join Point和Advice共同构成了AOP编程的基础框架。它们之间的关系可以概括为:Aspect通过定义Advice来指定在哪些Join Point上执行哪些动作。具体来说,Aspect首先声明一个或多个Advice,然后通过Pointcut(尽管Pointcut不是Aspect的直接组成部分,但它是连接Advice和Join Point的关键)来指定这些Advice应该应用到哪些Join Point上。 在Spring AOP中,这种关系通常通过配置或注解的方式来定义。例如,使用Spring的`@Aspect`注解来定义一个Aspect,然后使用`@Before`、`@AfterReturning`、`@AfterThrowing`、`@After`或`@Around`注解来定义不同类型的Advice,并通过表达式(如execution表达式)来指定Pointcut,从而确定Advice的应用范围。 #### 五、实际应用示例 为了更直观地理解Aspect、Join Point和Advice之间的关系,我们可以考虑一个日志记录的例子。假设我们需要在多个服务层的方法调用前后记录日志,这些日志记录操作就是横切关注点。我们可以定义一个Aspect来处理这些日志记录操作: ```java @Aspect public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBeforeServiceMethod(JoinPoint joinPoint) { System.out.println("Before executing " + joinPoint.getSignature().getName()); } @AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result") public void logAfterReturningServiceMethod(JoinPoint joinPoint, Object result) { System.out.println("After returning from " + joinPoint.getSignature().getName() + ", result: " + result); } // 可以继续添加其他类型的Advice } ``` 在这个例子中,`LoggingAspect`是一个Aspect,它定义了两个Advice:`logBeforeServiceMethod`(前置通知)和`logAfterReturningServiceMethod`(返回后通知)。通过`@Before`和`@AfterReturning`注解,我们指定了这些Advice应该应用到哪些Join Point上(这里是所有位于`com.example.service`包下的类的方法调用)。Pointcut通过表达式`execution(* com.example.service.*.*(..))`来定义,它指定了Join Point的匹配规则。 通过这种方式,我们成功地将日志记录这一横切关注点从业务逻辑中分离出来,提高了代码的可维护性和可重用性。同时,我们也深刻理解了Aspect、Join Point和Advice在AOP编程中的重要作用和相互关系。 #### 结语 AOP编程思想通过引入Aspect、Join Point和Advice等核心概念,为开发者提供了一种高效处理横切关注点的方法。在Spring AOP中,这些概念被赋予了具体的实现和丰富的配置选项,使得开发者能够轻松地在应用程序中集成AOP,从而提升代码的质量和可维护性。通过本章的学习,希望读者能够对AOP的基本概念有深入的理解,并能够在实际项目中灵活运用AOP技术。
上一篇:
AOP常见使用场景
下一篇:
Java AOP设计模式:代理、判断和拦截器模式
该分类下的相关小册推荐:
Java高并发秒杀入门与实战
Java语言基础1-基础知识
Java语言基础2-运算符
Java并发编程实战
java源码学习笔记
Java语言基础6-面向对象高级
Java性能调优实战
Java并发编程
Java语言基础10-Java中的集合
Java语言基础7-Java中的异常
Java语言基础3-流程控制
SpringBoot合辑-初级篇