SpringAOP和AspectJ有什么关系 ?

2024-04-01 21:04
文章标签 关系 aspectj springaop

本文主要是介绍SpringAOP和AspectJ有什么关系 ?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉
🍎个人主页:Leo的博客
💞当前专栏:每天一个知识点
✨特色专栏: MySQL学习
🥭本文内容:SpringAOP和AspectJ有什么关系 ?
📚个人知识库: Leo知识库,欢迎大家访问

我们知道现在开发都是Spring,讲的最多的也是SpringAOP,在说springAOP前,先了解下AOP是什么?
AOP是通过 “预编译方式” 和 “运行期间动态代理” 实现程序功能的统一维护的一种技术。AOP是一个概念,其实现技术有AspectJ和springAOP,现在对AOP有个清楚的了解了,再来看下AOP中的一些概念。

  1. 切面(aspect),业务层面是程序中的标准代码/功能,不同于实际的业务逻辑,比如日志功能、事务等。代码层面切点+通知构成了一个切面。
  2. 连接点(joinPoint),程序运行过程中的某个特定点,比如方法执行、字段赋值、方法调用等。
  3. 切点/切入点(pointCut),一个匹配连接点的正则表达式。 每当任何连接点匹配一个切入点时,就执行与该切入点相关联的通知。可以把切入点看作是符合条件的连接点。
  4. 通知(advice),在一个连接点中,切面采取的行动,简单点说是对切点做什么事,主要有before、afterReturning、round等通知。
  5. 织入(weaving),连接切面和目标对象来创建一个通知对象的过程,简单点说是把通知应用到连接点的过程。

基本概念

  • Spring AOP:Spring AOP是Spring框架的一个模块,提供了面向切面编程的实现。它允许开发者定义横切关注点(cross-cutting concerns),比如日志、事务管理等,而不需要修改主业务逻辑代码。Spring AOP是通过代理方式实现的,它在运行时通过JDK动态代理或CGLIB代理为目标对象创建一个代理对象来实现横切逻辑的织入。
  • AspectJ:AspectJ是一个成熟的、功能完备的面向切面编程(AOP)框架,它不仅可以与Spring集成,还可以独立使用。AspectJ提供了比Spring AOP更为强大的切面功能,包括编译时织入、加载时织入等,允许在不同的编程生命周期阶段应用切面逻辑。

他们之间的关系

  • 互补性:Spring AOP和AspectJ在AOP领域是互补的。Spring AOP主要解决了企业应用中的常见问题,比如声明式事务和安全性,而AspectJ则提供了更为全面的AOP支持,包括那些Spring AOP无法处理的场景。
  • 集成性:Spring AOP在内部可以集成AspectJ的某些功能。例如,Spring可以使用AspectJ的注解(比如@Aspect),并且Spring也支持AspectJ的编织方式(尽管默认情况下使用的是Spring AOP的代理方式)。这意味着我们程序员可以在Spring框架中使用AspectJ的强大功能,而不必完全依赖AspectJ。

使用场景

  • Spring AOP:适用于简单的AOP需求,如声明式事务管理、日志记录等。当AOP需求不是特别复杂,或者希望完全融入Spring生态系统时,Spring AOP是一个很好的选择。
  • AspectJ:适用于需要复杂AOP处理的场景,如需要在编译时就织入切面的场合。如果需要全面的AOP支持,或者要处理Spring AOP无法处理的切面织入,AspectJ是更合适的选择。

实现方式不同

  • Spring AOP 使用代理的方式实现 AOP。Spring 利用 JDK 动态代理 或 CGLIB 代理创建代理对象,代理对象包装目标对象并拦截指定的切点方法,以执行通知。
  • AspectJ 支持两种方式实现 AOP。第一种方式是编译时织入,即在编译时将切面代码织入到目标类中。第二种方式是运行时织入,即在目标类加载时通过修改字节码方式织入切面代码。
    性能和能力
  • 性能:由于AspectJ可以在编译时织入切面,因此它通常在运行时性能上优于Spring AOP。Spring AOP在运行时创建代理对象,这可能会引入一些性能开销。
  • 能力:AspectJ提供了比Spring AOP更丰富的切面指令和织入选项,例如pointcut的表达能力更强,支持after、before、around等不同类型的通知,以及更精细的控制如within、call、execution等。

这篇关于SpringAOP和AspectJ有什么关系 ?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/868134

相关文章

Java 中的 equals 和 hashCode 方法关系与正确重写实践案例

《Java中的equals和hashCode方法关系与正确重写实践案例》在Java中,equals和hashCode方法是Object类的核心方法,广泛用于对象比较和哈希集合(如HashMa... 目录一、背景与需求分析1.1 equals 和 hashCode 的背景1.2 需求分析1.3 技术挑战1.4

SpringBoot AspectJ切面配合自定义注解实现权限校验的示例详解

《SpringBootAspectJ切面配合自定义注解实现权限校验的示例详解》本文章介绍了如何通过创建自定义的权限校验注解,配合AspectJ切面拦截注解实现权限校验,本文结合实例代码给大家介绍的非... 目录1. 创建权限校验注解2. 创建ASPectJ切面拦截注解校验权限3. 用法示例A. 参考文章本文

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

python安装whl包并解决依赖关系的实现

《python安装whl包并解决依赖关系的实现》本文主要介绍了python安装whl包并解决依赖关系的实现,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录一、什么是whl文件?二、我们为什么需要使用whl文件来安装python库?三、我们应该去哪儿下

MYSQL关联关系查询方式

《MYSQL关联关系查询方式》文章详细介绍了MySQL中如何使用内连接和左外连接进行表的关联查询,并展示了如何选择列和使用别名,文章还提供了一些关于查询优化的建议,并鼓励读者参考和支持脚本之家... 目录mysql关联关系查询关联关系查询这个查询做了以下几件事MySQL自关联查询总结MYSQL关联关系查询

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip