Spring AOP 和 AspectJ 有什么区别?

前言

Spring AOP和AspectJ AOP都是面向切面编程(AOP)的实现,但它们在实现方式、灵活性、依赖性、性能和使用场景等方面存在显著区别。‌

‌一、实现方式‌

‌Spring AOP‌:基于代理机制,使用JDK动态代理和CGLIB(Code Generation Library)在运行时生成代理对象,通过代理对象拦截方法调用并执行切面逻辑。这种方式对Spring管理的Bean生效,支持灵活的切点表达式,但对非Spring Bean的方法调用无效‌。

‌AspectJ AOP‌:使用编译时织入或类加载时织入,通过修改目标类的字节码来实现切面逻辑。这种方式不依赖于代理,可以应用于任何Java对象,支持更丰富的切面逻辑,但需要额外的配置和复杂性‌。

‌二、灵活性‌

‌Spring AOP‌:主要对Spring管理的Bean生效,支持方法级别的切面,切点表达式相对简单‌。

‌AspectJ AOP‌:不仅限于Spring管理的Bean,可以应用于所有Java对象,支持类级别和方法级别的切面,切点表达式更为丰富和复杂‌。

‌三、依赖性‌

‌Spring AOP‌:依赖于Spring框架,与Spring容器紧密集成,适用于Spring项目‌。

‌AspectJ AOP‌:作为一个独立的框架,不依赖于Spring或其他容器,适用于任何Java项目‌。

四、性能‌

‌Spring AOP‌:动态代理的方式相对轻量,性能较好,但对于大规模或频繁的切面逻辑可能会有性能损耗‌。

‌AspectJ AOP‌:通过编译时或类加载时织入,性能较高,但配置和使用更为复杂‌。

五、使用场景‌

‌Spring AOP‌:适用于轻量级的AOP需求,如日志记录、事务管理等,对Spring框架集成友好‌。

‌AspectJ AOP‌:适用于复杂的AOP需求,如系统架构中需要对各个层次的组件进行切面,或对非Spring Bean的对象进行切面等‌。

总体而言,选择Spring AOP还是AspectJ AOP取决于具体的项目需求和场景,以及对AOP实现方式的偏好。

这两者总的来说

Spring AOP 是spring支持的面向切面AOP 编程。AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。

目标对比

SpringAOP 不是一个完备的AOP 方案。

AspectJ是最首创的AOP技术,用来提供全面的AOP方案。

织入方式

AspectJ 使用了三种不同类型的织入方式

  • Compile-time weaving:编译期织入。编译器将切面和应用的源代码编译在一个字节码文件中。
  • Post-compile weaving:编译后织入。也称为二进制织入。将已有的字节码文件与切面编制在一起。
  • Load-time weaving:加载时织入。与编译后织入一样,只是织入时间会推迟到类加载到jvm时。

Spring AOP使用运行时织入(runtime weaving)

在运行时织入,是使用目标对象的代理对象织入的。

SpringAOP 是基于动态代理的实现AOP,这意味着实现目标对象的切面会创建一个代理类(两种代理模式)。而AspectJ在程序运行期是不会做任何事情的,因为类和切面是直接编译在一起的,这种方式称为静态代理。

性能上来说,编译期织入要比运行期织入快很多。因此aspectJ 的运行速度要快于springAOP。

连接点 Joinpoints

Spring AOP 只支持方法执行连接点,而ASpectJ 还支持 方法调用,构造方法调用,属性引用,静态初始化、其他切面的通知等 作为连接点。 功能相当强大。

相关推荐
.生产的驴10 分钟前
SpringBoot 对接第三方登录 手机号登录 手机号验证 微信小程序登录 结合Redis SaToken
java·spring boot·redis·后端·缓存·微信小程序·maven
爱上语文12 分钟前
宠物管理系统:Dao层
java·开发语言·宠物
顽疲15 分钟前
springboot vue 会员收银系统 含源码 开发流程
vue.js·spring boot·后端
王ASC44 分钟前
SpringMVC的URL组成,以及URI中对/斜杠的处理,解决IllegalStateException: Ambiguous mapping
java·mvc·springboot·web
撒呼呼1 小时前
# 起步专用 - 哔哩哔哩全模块超还原设计!(内含接口文档、数据库设计)
数据库·spring boot·spring·mvc·springboot
是小崔啊1 小时前
开源轮子 - Apache Common
java·开源·apache
因我你好久不见1 小时前
springboot java ffmpeg 视频压缩、提取视频帧图片、获取视频分辨率
java·spring boot·ffmpeg
程序员shen1616111 小时前
抖音短视频saas矩阵源码系统开发所需掌握的技术
java·前端·数据库·python·算法
Ling_suu1 小时前
SpringBoot3——Web开发
java·服务器·前端
hanglove_lucky1 小时前
本地摄像头视频流在html中打开
前端·后端·html