首页
技术小册
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 编程思想(上)
### Java AOP拦截器模式(Interceptor):拦截执行分别代表什么? 在深入探讨Spring AOP(面向切面编程)的精髓之前,理解Java中的拦截器模式(Interceptor Pattern)是至关重要的。拦截器模式是一种行为型设计模式,它允许在方法执行前后或方法抛出异常时插入自定义的行为。这种模式在Spring框架中得到了广泛应用,特别是在Spring AOP的实现中,拦截器模式是实现切面(Aspect)功能的核心机制之一。本章将详细解析Java AOP中的拦截器模式,特别是“拦截”与“执行”这两个核心概念,以及它们在AOP中的具体表现和应用。 #### 一、拦截器模式概述 拦截器模式通过定义一个拦截器类来封装将要被拦截的方法的调用,允许在这些方法调用前后执行某些操作,甚至改变方法调用的结果或决定是否继续执行该方法。这种设计模式主要用于处理跨多个类的横切关注点(如日志记录、事务管理、安全检查等),从而避免代码的重复和耦合。 在Java中,拦截器通常通过代理(Proxy)机制实现,即创建一个代理对象,该对象在被调用时执行拦截逻辑,然后调用实际对象的方法。Spring AOP正是基于动态代理(JDK动态代理或CGLIB代理)来实现拦截器模式的。 #### 二、拦截执行的核心概念 在Java AOP拦截器模式下,“拦截”与“执行”是两个核心概念,它们共同构成了AOP的核心功能。 ##### 2.1 拦截(Intercept) “拦截”指的是在目标方法执行前、执行后或抛出异常时,拦截器介入并执行一些预定义的操作。这些操作可以是日志记录、权限校验、事务管理等。拦截过程通常包括以下几个关键步骤: 1. **前置拦截(Before Advice)**:在目标方法执行之前执行的操作。这可以用于设置必要的上下文信息、执行权限检查等。 2. **后置拦截(After Returning Advice)**:在目标方法正常执行完毕后执行的操作。这通常用于清理资源、记录方法执行时间等。 3. **异常拦截(After Throwing Advice)**:在目标方法抛出异常时执行的操作。这允许开发者对异常进行统一处理,如记录错误信息、进行回滚操作等。 4. **最终拦截(After Advice)**:无论目标方法执行成功还是抛出异常,最终都会执行的操作。这主要用于资源释放、清理工作等。 5. **环绕拦截(Around Advice)**:这是最强大的拦截方式,它允许在目标方法执行前后进行拦截,并且可以决定是否继续执行目标方法或替换其返回值。 ##### 2.2 执行(Execute) “执行”指的是目标方法(即被拦截器拦截的方法)的实际执行过程。在AOP中,目标方法的执行被置于拦截逻辑的控制之下,但拦截器本身并不改变目标方法的代码或逻辑。相反,它通过代理机制在目标方法执行前后插入额外的行为。 #### 三、Spring AOP中的拦截器实现 在Spring AOP中,拦截器通常通过定义切面(Aspect)来实现,切面是一个跨越多个类的关注点模块化,它可以被看作是一个包含了多个通知(Advice)和切入点(Pointcut)的容器。 ##### 3.1 通知(Advice) 在Spring AOP中,通知是拦截逻辑的封装,它定义了拦截器在何时(如方法执行前、后或抛出异常时)以及以何种方式(如前置通知、后置通知等)介入目标方法的执行。Spring AOP支持五种类型的通知: - **@Before**:前置通知,在目标方法执行前执行。 - **@AfterReturning**:后置通知,在目标方法正常执行完毕后执行。 - **@AfterThrowing**:异常通知,在目标方法抛出异常时执行。 - **@After**(或@Finally):最终通知,无论目标方法执行结果如何,都会执行。 - **@Around**:环绕通知,可以在目标方法执行前后进行拦截,并可以控制是否继续执行目标方法或替换其返回值。 ##### 3.2 切入点(Pointcut) 切入点定义了哪些方法会被拦截器拦截。在Spring AOP中,切入点通过表达式来指定,这些表达式基于方法的签名(如方法名、参数类型等)来选择特定的方法。 ##### 3.3 切面(Aspect) 切面是通知和切入点的结合体,它定义了哪些方法(通过切入点指定)在何时(通过通知类型指定)以及以何种方式(通过通知体实现)被拦截。在Spring AOP中,切面通常通过注解(如`@Aspect`)来定义,并包含了一系列的通知定义。 #### 四、拦截执行的应用场景 拦截器模式在Java AOP中有着广泛的应用场景,包括但不限于: 1. **日志记录**:在方法执行前后记录日志,帮助开发者追踪系统的运行状态。 2. **事务管理**:在方法执行前后管理数据库事务,确保数据的一致性和完整性。 3. **权限校验**:在方法执行前检查用户权限,防止未授权访问。 4. **性能监控**:在方法执行前后记录时间,计算并监控方法的执行效率。 5. **缓存处理**:在方法执行前检查缓存,如果缓存存在则直接返回缓存结果,否则执行方法并更新缓存。 #### 五、总结 Java AOP拦截器模式通过拦截器在方法执行前后或抛出异常时插入自定义行为,实现了横切关注点的模块化,降低了代码的耦合度,提高了系统的可维护性和可扩展性。在Spring AOP中,拦截器通过定义切面、通知和切入点来实现,为开发者提供了一种灵活且强大的方式来处理跨多个类的横切关注点。理解拦截器模式及其在Spring AOP中的实现原理,对于编写高质量、可维护的Java应用程序至关重要。
上一篇:
Java AOP判断模式(Predicate):如何筛选Join Point?
下一篇:
Spring AOP 功能概述:核心特性、编程模型和使用限制
该分类下的相关小册推荐:
深入理解Java虚拟机
Java语言基础8-Java多线程
Java语言基础12-网络编程
Java语言基础15-单元测试和日志技术
SpringBoot零基础到实战
SpringBoot合辑-初级篇
Java语言基础14-枚举和注解
Mybatis合辑1-Mybatis基础入门
Java并发编程实战
Java必知必会-JDBC
Mybatis合辑5-注解、扩展、SQL构建
Java语言基础2-运算符