首页
技术小册
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 After Advice 的 AspectJ 实现 #### 引言 在Spring AOP(面向切面编程)的广阔领域中,AspectJ以其强大的功能和灵活性占据了重要地位。AspectJ不仅支持Spring AOP的核心概念,如通知(Advice)、切入点(JoinPoint)、切面(Aspect)等,还提供了更为丰富的语言特性和编程模型。本章将深入探讨如何在AspectJ中实现Joinpoint After Advice,即如何在方法执行后(无论是正常结束还是异常退出)应用增强逻辑。 #### 一、AspectJ基础回顾 ##### 1.1 AspectJ简介 AspectJ是一个面向切面的编程语言,它扩展了Java语言,通过引入切面、连接点、通知等概念,允许开发者以声明的方式将横切关注点(如日志、事务管理、安全检查等)与业务逻辑分离,从而提高代码的可维护性和模块化。 ##### 1.2 核心概念 - **切面(Aspect)**:是跨越多个类的关注点的模块化,如日志记录。 - **连接点(JoinPoint)**:是程序执行过程中的一个点,如方法的执行或异常的处理。 - **通知(Advice)**:是在特定连接点执行的代码,如方法执行前后进行的操作。 - **切入点(Pointcut)**:定义了通知应被织入的具体连接点集合。 ##### 1.3 AspectJ的两种使用方式 1. **编译时织入**:使用AspectJ编译器ajc将AspectJ代码编译成Java字节码。 2. **加载时织入**:通过特殊的类加载器在Java应用运行时动态地将切面织入到目标类中。 #### 二、Joinpoint After Advice详解 ##### 2.1 定义 Joinpoint After Advice是指在目标方法执行完毕后(无论是否抛出异常)执行的通知。它允许开发者在方法返回后或异常抛出后进行一些后处理操作,如资源清理、审计日志记录等。 ##### 2.2 关键点 - **执行时机**:在方法返回或异常抛出之后。 - **异常处理**:如果方法执行过程中抛出了异常,After Advice仍然会被执行。 - **返回值不可访问**:在After Advice中,不能直接访问方法的返回值(除非使用After Returning Advice)。 #### 三、AspectJ实现Joinpoint After Advice ##### 3.1 编写Aspect类 首先,需要定义一个Aspect类,并使用`@Aspect`注解标识它是一个切面。然后,在类中编写After Advice的实现。 ```java import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.After; import org.aspectj.lang.JoinPoint; @Aspect public class AfterAdviceAspect { // 定义一个切入点表达式,这里以execution为例 // 假设我们想要对所有service包下的类中的所有方法进行增强 private static final String POINTCUT_EXPRESSION = "execution(* com.example.service..*.*(..))"; // 使用@After注解定义After Advice // value属性指定了切入点表达式 @After(value = POINTCUT_EXPRESSION) public void afterMethodExecution(JoinPoint joinPoint) { // 这里编写方法执行后的逻辑 System.out.println("After method execution: " + joinPoint.getSignature().getName()); // 如果需要,可以根据joinPoint获取更多信息,如参数、目标对象等 // 但请注意,在After Advice中无法直接访问方法的返回值 } } ``` ##### 3.2 配置AspectJ AspectJ的配置取决于你的项目是如何构建的。以下是一些常见的配置方式: - **基于Maven的项目**:使用AspectJ Maven插件进行编译时织入。 - **基于Gradle的项目**:使用AspectJ Gradle插件。 - **Spring Boot项目**:Spring Boot自动支持AspectJ,只需确保Aspect类被Spring容器管理即可。 ##### 3.3 编译与运行 如果是编译时织入,确保AspectJ编译器(ajc)被正确配置并运行。如果是运行时织入,则需要确保相关的AspectJ库被正确加载到应用中。 #### 四、高级话题 ##### 4.1 异常处理 虽然After Advice会在方法抛出异常后被执行,但如果你需要基于异常类型进行不同的处理,可以考虑使用`@AfterThrowing`注解定义After Throwing Advice。 ##### 4.2 性能考量 AspectJ的引入可能会增加应用的复杂度,并可能对性能产生一定影响(尽管这种影响通常很小)。在性能敏感的应用中,应仔细评估是否每个切面都是必要的,并考虑使用懒加载或条件切入点来减少不必要的织入。 ##### 4.3 与Spring AOP的互操作性 AspectJ是Spring AOP的底层实现之一。在Spring应用中,可以直接使用AspectJ的注解和API来定义切面,Spring容器会自动识别和织入这些切面。同时,Spring也提供了一些额外的特性,如基于XML的配置和更丰富的AOP支持,这些可以与AspectJ结合使用。 #### 五、结论 通过本章的学习,我们深入了解了AspectJ中Joinpoint After Advice的实现方法。AspectJ以其强大的功能和灵活性,为Spring AOP提供了丰富的编程模型和语言特性。掌握AspectJ不仅能够帮助我们更好地理解和应用Spring AOP,还能提升我们处理复杂横切关注点的能力。希望读者能够通过实践,进一步加深对这些概念的理解,并在自己的项目中灵活应用。
上一篇:
Joinpoint After Advice标准实现
下一篇:
Advice容器接口 - Advisor
该分类下的相关小册推荐:
Java语言基础6-面向对象高级
Java语言基础2-运算符
Mybatis合辑5-注解、扩展、SQL构建
Java必知必会-Maven高级
深入理解Java虚拟机
Java语言基础9-常用API和常见算法
Java语言基础10-Java中的集合
Java面试指南
Java语言基础8-Java多线程
Java语言基础12-网络编程
Java并发编程实战
深入拆解 Java 虚拟机