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等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/792207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux是什么,该如何学习

🐇明明跟你说过:个人主页 🏅个人专栏:《Linux :从菜鸟到飞鸟的逆袭》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、Linux的起源与发展 2、Linux在现代计算机领域…

Golang 内存管理和垃圾回收底层原理(一)

一、这篇文章我们来聊聊Golang内存管理和垃圾回收,主要注重基本底层原理讲解,进一步实战待后续文章 1、这篇我们来讨论一下Golang的内存管理 先上结构图 从图我们来讲Golang的基本内存结构,内存结构可以分为:协程缓存、中央缓存…

Excel 粘贴回筛选后的单元格不能完全粘老是少数据 ,有些单元格还是空的

环境: excel2021 Win10专业版 问题描述: excel 粘贴回筛选后的单元格不能完全粘老是少数据 有些单元格还是空的 复制选择筛选后A1-A10单元格 ,定位条件)(仅可见单元格)来访问,或者你可以使用…

mybatis-plus 表字段存在关键字的处理办法

一、问题复现 当数据库表中字段出现关键字时&#xff0c;若不做其他处理&#xff0c;mybatis-plus的BaseMapper并不会做其他的处理&#xff0c;最终导致SQL执行时&#xff0c;抛出SQL 语法错误。示例如下&#xff1a; Java查询语句 QueryWrapper<User> userQuery new …

Kubernetes(k8s)核心资源解析:Pod详解

Kubernetes核心资源解析&#xff1a;Pod详解 1、什么是Pod&#xff1f;2、Pod 的组成3、Pod 如何管理多个容器4、Pod 的网络5、Pod 的存储方式6、Pod 的工作方式6.1 自主式 Pod6.2 监控和管理 Pod6.3 Pod 的创建流程 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收…

linux三剑客之流编辑器sed

sed&#xff08;stream editor&#xff09;是Linux和Unix系统中一个非常强大的文本处理工具。它主要用于对文本数据进行过滤和转换。sed 可以在不打开文件的情况下&#xff0c;直接对输入流进行操作&#xff0c;并且可以将结果输出到标准输出或文件。 基本语法&#xff1a; s…

C# Task任务详细讲解

Task基础讲解 在C#中&#xff0c;Task 是用于表示异步操作的类。它属于 System.Threading.Tasks 命名空间&#xff0c;并允许你以异步方式执行代码&#xff0c;从而不阻塞主线程。这对于I/O密集型操作&#xff08;如网络请求或文件读写&#xff09;或CPU密集型任务非常有用&am…

微信小程序——小程序和页面生命周期详解

小程序的生命周期 小程序的生命周期主要分为以下几个阶段&#xff1a; 创建&#xff08;onLoad&#xff09;&#xff1a; 当小程序启动时&#xff0c;或者从其他页面跳转到当前页面时&#xff0c;会触发 onLoad 生命周期函数。 这个阶段通常用于初始化页面数据&#xff0c;从服…

解锁动态规划:从斐波那契到高效算法

动态规划&#xff08;Dynamic Programming, DP&#xff09;是解决优化问题的一种算法策略&#xff0c;它将一个复杂问题分解为更小的子问题&#xff0c;通过解决子问题来逐步找到复杂问题的最优解。动态规划适用于有重叠子问题和最优子结构性质的问题。接下来&#xff0c;我们通…

windows下使用wget批量下载银河麒麟软件仓库中的软件包——Wget for windows

1.什么是wget? wget是一个强力方便的命令行下的下载工具,可以通过HTTP和FTP协议(两种最广泛的互联网协议)从因特网中检索并获取文件。 此外,wget还具有如下特点: 以非交互方式工作,因而能够在用户注销后在后台进行工作(针对Linux command)。在缓慢甚至不稳定的连接中依…

基于SSM的药店药品商城管理系统

介绍 本项目分为前后台&#xff0c;分为管理员与普通用户两种角色&#xff0c;管理员登录后台&#xff0c;普通用户登录前台&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,订单管理,客户管理,药品管理,类目管理等功能。用户角色包含以下功能&#xff1a; 用户首…

pycharm打包python文件为exe文件(图文教程)

1.安装pyinstaller库 pip3 install pyinstaller 2.使用pyinstaller 打包文件 首先确保Terminal命令行中&#xff0c;你的路径和你的项目是同一个路径 我的项目就是放在golden_dev中的。 3.命令行内输入打包代码 pyinstaller -F -w gold_miner.py gold_miner.py 是我的项目…

【linux】Ubuntu 查询CPU、GPU、硬盘、内存等硬件信息

环境 硬件&#xff1a;通用PC /Jetson Xavier NX 套件 系统&#xff1a;Ubuntu 20.04 软件 &#xff1a; 获取CPU信息 在Ubuntu系统中&#xff0c;可以通过在终端执行以下命令来获取CPU的名称&#xff1a; lscpu如果需要精准查找CPU名称 、核心数、厂商可以使用 查看CPU名…

前视声呐目标识别定位(二)-目标识别定位模块

前视声呐目标识别定位&#xff08;一&#xff09;-基础知识 前视声呐目标识别定位&#xff08;二&#xff09;-目标识别定位模块 前视声呐目标识别定位&#xff08;三&#xff09;-部署至机器人 前视声呐目标识别定位&#xff08;四&#xff09;-代码解析之启动识别模块 …

[xboard]real6410-6.1 移植rootfs之busybox

文章目录 busybox下载 https://busybox.net/downloads/ [图片] wget https://busybox.net/downloads/busybox-x.yy.z.tar.bz2 tar xvf busybox-x.yy.z.tar.bz2 busybox配置编译 busybox-1.35.0$ export CROSS_COMPILE=/home/gjw/2024/compile/arm-2014.05/bin/arm-none-linux-g…

【ZZULIOJ】1033: 五级制成绩(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy code 题目描述 给定一个百分制成绩, 请根据百分制成绩输出其对应的等级。转换关系如下&#xff1a; 90分及以上为’A’&#xff0c;80~89为’B’&#xff0c; 70~79为’C’&#xff0c; 60~69为’D’&#xff0c;6…

高斯消元详解

算法概述 高斯消元法是一个用来求解线性方程组的算法 那么什么是线性方程组呢? 线性:每个未知数次数都为1次方程组:多个方程&#xff0c;多个未知数。 &#xff08;a1x1a2x2..anxnbn&#xff09;x为一次的 当x是平方的时候就不是线性 简而言之就是有多个未知数&#xff…

0基础学习Mybatis系列数据库操作框架——多环境配置

大纲 配置代码参考资料 在实际开发中&#xff0c;我们往往会将开发环境分成&#xff1a;开发、测试、线上等环境。这些环境的数据源不一样&#xff0c;比如开发环境就不能访问线上环境&#xff0c;否则极容易出现线上数据污染等问题。Mybatis通过多环境配置分开定义来解决这个问…

Shell脚本之基本语法

目录 一、变量定义 变量命名规则&#xff1a; 变量的赋值&#xff1a; 只读变量&#xff1a; 删除变量&#xff1a; 二、变量的类型 自定义变量&#xff1a; 环境变量&#xff1a; 位置参数&#xff1a; 预定义变量&#xff1a; 三、键盘输入 四、数值运算 为什么…

数据结构—堆

什么是堆 堆是一种特殊的树形结构&#xff0c;其中每个节点都有一个值。堆可以分为两种类型&#xff1a;最大堆和最小堆。在最大堆中&#xff0c;每个节点的值都大于等于其子节点的值&#xff1b;而在最小堆中&#xff0c;每个节点的值都小于等于其子节点的值。这种特性使得堆…