首页
技术小册
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 编程思想(上)
### 章节:Pointcut与Advice连接器 - PointcutAdvisor 在Spring AOP(面向切面编程)的广阔天地中,`Pointcut`与`Advice`是构成其核心概念的两块基石。它们分别负责定义切点(即哪些方法或连接点会被拦截)和增强逻辑(即在切点处执行的额外代码)。然而,单独使用`Pointcut`和`Advice`往往不足以满足复杂应用场景的需求,这时就需要一个强大的连接器——`PointcutAdvisor`,来将二者紧密地结合在一起,形成完整的切面定义。本章将深入探讨`PointcutAdvisor`的角色、工作原理、实现方式及其在Spring AOP中的应用。 #### 一、Pointcut与Advice的回顾 **1.1 Pointcut(切点)** `Pointcut`定义了哪些连接点(如方法调用)会被切面增强。在Spring AOP中,切点表达式通常使用AspectJ的切点表达式语言编写,这些表达式能够精确匹配方法执行、异常抛出、字段读写等多种类型的连接点。例如,一个简单的方法执行切点表达式可能看起来像这样:`execution(* com.example.service.*.*(..))`,它表示匹配`com.example.service`包下所有类的所有方法的执行。 **1.2 Advice(增强)** `Advice`则定义了切面在切点处要执行的具体逻辑。Spring AOP支持多种类型的Advice,包括前置通知(Before Advice)、后置返回通知(After Returning Advice)、异常通知(After Throwing Advice)、后置最终通知(After Advice,无论方法执行结果如何都会执行)以及环绕通知(Around Advice,可以在方法执行前后及异常情况下执行自定义逻辑)。 #### 二、PointcutAdvisor的必要性 虽然`Pointcut`和`Advice`各自独立地定义了切面的两个关键方面,但在实际应用中,我们往往需要将特定的Advice应用到特定的Pointcut上。这时,直接通过编程方式将二者绑定在一起可能会显得繁琐且不易维护。因此,Spring AOP引入了`PointcutAdvisor`接口,作为`Pointcut`和`Advice`的桥梁,提供了一种更灵活、更易于管理的切面定义方式。 #### 三、PointcutAdvisor的工作原理 `PointcutAdvisor`是Spring AOP中的一个关键接口,它同时包含了`Pointcut`和`Advice`的信息。当一个切面被应用到目标对象上时,Spring AOP框架会遍历所有的`PointcutAdvisor`实例,利用其中的`Pointcut`来确定哪些连接点(如方法调用)符合条件,然后针对这些连接点执行相应的`Advice`。 具体来说,`PointcutAdvisor`的工作流程可以分为以下几个步骤: 1. **注册Advisor**:首先,用户需要创建`PointcutAdvisor`实例,并将其注册到Spring容器中。注册过程通常是通过配置文件或注解完成的。 2. **解析Pointcut**:Spring AOP框架会解析`PointcutAdvisor`中的`Pointcut`表达式,以确定哪些连接点(如方法调用)会被拦截。 3. **匹配连接点**:在运行时,每当有方法调用发生时,Spring AOP框架会检查该方法调用是否匹配任何一个`PointcutAdvisor`中的`Pointcut`。 4. **执行Advice**:如果方法调用匹配了某个`Pointcut`,则Spring AOP框架会执行与该`Pointcut`关联的`Advice`。 #### 四、PointcutAdvisor的实现方式 在Spring中,`PointcutAdvisor`接口有多种实现方式,其中最常用的是`DefaultPointcutAdvisor`。此外,用户还可以通过实现`PointcutAdvisor`接口来创建自定义的Advisor。 **4.1 DefaultPointcutAdvisor** `DefaultPointcutAdvisor`是`PointcutAdvisor`的一个简单实现,它允许用户直接设置`Pointcut`和`Advice`。这种实现方式非常直观,适合大多数基本需求。 ```java @Bean public DefaultPointcutAdvisor myAdvisor() { DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(); advisor.setPointcut(new AspectJExpressionPointcut("execution(* com.example.service.*.*(..))")); advisor.setAdvice(new MyBeforeAdvice()); return advisor; } ``` **4.2 自定义PointcutAdvisor** 对于更复杂的场景,用户可能需要通过实现`PointcutAdvisor`接口来创建自定义的Advisor。这允许用户完全控制切点的匹配逻辑和增强的执行方式。 ```java public class MyCustomPointcutAdvisor implements PointcutAdvisor { private Pointcut pointcut; private Advice advice; public MyCustomPointcutAdvisor(Pointcut pointcut, Advice advice) { this.pointcut = pointcut; this.advice = advice; } @Override public Pointcut getPointcut() { return pointcut; } @Override public Advice getAdvice() { return advice; } // 实现其他必要的方法,如isPerInstance()等 } ``` #### 五、PointcutAdvisor的应用场景 `PointcutAdvisor`在Spring AOP中扮演着至关重要的角色,它广泛应用于各种需要切面编程的场景中,包括但不限于: - **日志记录**:在方法执行前后记录日志,帮助开发者了解程序的执行流程。 - **权限检查**:在方法执行前进行权限验证,确保只有拥有相应权限的用户才能执行特定操作。 - **事务管理**:在方法执行前后进行事务的开启和关闭,确保数据的一致性和完整性。 - **性能监控**:在方法执行前后记录时间戳,以监控方法的执行效率。 #### 六、总结 `PointcutAdvisor`作为Spring AOP中`Pointcut`与`Advice`的连接器,不仅简化了切面的定义过程,还提高了切面应用的灵活性和可维护性。通过深入理解`PointcutAdvisor`的工作原理和实现方式,开发者可以更加高效地利用Spring AOP进行面向切面编程,从而实现更加松耦合、高内聚的应用程序架构。在未来的Spring AOP编程实践中,`PointcutAdvisor`将继续发挥其不可替代的作用,助力开发者构建更加优雅、强大的软件系统。
上一篇:
Advice容器接口 - Advisor
下一篇:
Introduction与Advice连接器 - IntroductionAdvisor
该分类下的相关小册推荐:
Spring Cloud微服务项目实战
深入理解Java虚拟机
Spring AOP 编程思想(下)
Java高并发秒杀入门与实战
Mybatis合辑4-Mybatis缓存机制
Java必知必会-Maven初级
Java面试指南
Java并发编程
Mybatis合辑2-Mybatis映射文件
Mybatis合辑1-Mybatis基础入门
SpringBoot合辑-高级篇
手把手带你学习SpringBoot-零基础到实战