Java面试八股之Spring AOP 和 AspectJ AOP 的区别

news2024/11/17 6:31:04
  1. Spring AOP 和 AspectJ AOP 的区别

Spring AOP 和 AspectJ AOP 是两种不同的面向切面编程(Aspect-Oriented Programming, AOP)实现。它们各有特点,适用于不同的场景。下面是一些主要的区别:

1. 实现机制

Spring AOP:

基于代理:Spring AOP 主要通过动态代理实现切面。对于实现了接口的类,它使用 JDK 动态代理;对于没有实现接口的类,则使用 CGLIB 字节码生成技术。

运行时织入:切面是在运行时动态地添加到目标对象上的。

AspectJ:

编译期织入:AspectJ 支持编译期、类加载期和运行时的织入。最常用的是编译期织入,这允许切面直接嵌入到应用程序的字节码中。

静态织入:AspectJ 编译后的字节码包含了切面逻辑,这意味着切面是静态的一部分。

2. 切点表达式

Spring AOP:

使用基于注解或 XML 的配置来定义切点。

使用较为简单的切点表达式语法,如 execution(* com.example.service.*.*(..)) 表示匹配 com.example.service 包下所有类的所有方法。

AspectJ:

使用更强大的切点表达式语法,能够更精细地控制切点的匹配。

支持更多类型的切点,比如基于类型、字段、构造函数、异常等。

3. 支持范围

Spring AOP:

主要关注于方法级别的拦截,不支持字段级或构造器级别的通知。

仅对由 Spring IoC 容器管理的 bean 的方法调用有效。

AspectJ:

支持方法调用、字段访问、构造器调用、异常抛出等多种类型的切点。

可以作用于任何 Java 类,不仅限于 Spring 管理的对象。

4. 通知类型

Spring AOP:

支持五种通知类型:前置通知、后置通知、最终通知、环绕通知和抛出通知。

AspectJ:

支持与 Spring AOP 相同的通知类型,并且还提供了更多的通知类型,例如初始化通知、静态初始化通知等。

5. 性能

Spring AOP:

由于其动态代理机制,性能可能会略低于 AspectJ,尤其是在高并发场景下。

AspectJ:

由于切面逻辑是在编译阶段就嵌入到了应用程序中,因此运行时性能通常更好。

6. 使用场景

Spring AOP:

适合轻量级的切面需求,如简单的日志记录、事务管理等。

当只需要在 Spring 管理的 bean 上应用切面时。

AspectJ:

更适合复杂的切面需求,如安全控制、数据校验等。

当需要在非 Spring 管理的代码上应用切面时。

7. 集成方式

Spring AOP:

作为 Spring 框架的一部分,不需要额外的工具或编译器支持。

AspectJ:

需要使用 AspectJ 编译器(ajc)或者集成到现有的构建工具中(如 Maven 或 Gradle)来进行编译期织入。

结论

选择 Spring AOP 还是 AspectJ AOP 主要取决于具体的应用需求和开发团队的偏好。对于简单的切面需求,Spring AOP 就足够了;而对于更复杂的需求,尤其是当需要更细粒度的切面控制时,AspectJ 是更好的选择。在实际开发中,两者也可以结合使用,例如在 Spring 应用中使用 AspectJ 的切点表达式和通知类型。

如果大家需要视频版本的讲解,欢迎关注我的B站:

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

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

相关文章

Python NLTK 情感分析不正确

1、问题背景 一位 Reddit 用户使用 Python 的 NLTK 库来训练一个朴素贝叶斯分类器以研究其他句子的情感,但是无论输入什么句子,分类器总是预测为正面。 2、解决方案 经过仔细检查,发现原始代码中的问题在于 wordList 为空。因此&#xff0…

【LLM】-12-部署Langchain-Chatchat-0.3.x版本

目录 1、0.3与0.2的功能对比 2、0.3.x支持多种部署方式 2.3、源码安装 2.3.1、项目源码下载 2.3.2、创建conda环境 2.3.3、安装poetry 2.3.4、安装依赖库 2.3.5、项目初始化 2.3.6、初始化知识库 2.3.7、启动服务 2.3.8、配置说明 2.3.8.1、basic_settings.yaml 2…

一副穿戴甲背后,5万苏北宝妈如何硬控全球美甲潮流?

2019年的一天,张达在拼多多后台看到一个有趣的订单。“看姓名、联系方式,像表妹下的订单,但我的穿戴甲店才开第二天,她应该不可能知道。”张达回忆。 1993年出生的张达,是江苏东海县人,当地以水晶闻名。高…

达梦数据库的系统视图v$bufferpool

达梦数据库的系统视图v$bufferpool 达梦数据库系统视图V$BUFFERPOOL的主要作用是监控和管理数据库缓冲池的性能。通过查询V$BUFFERPOOL视图,用户可以获取以下关键信息: 缓存命中率:显示缓冲池的命中率,即从缓冲池中成功获取数据的…

嵌入式☞第二组(壹)

C语言基础: 循环的构成: 循环体 循环条件 循环的分类: 无限循环:程序设计中尽量避免无限循环。(程序中的无限循环必须可控) 有限循环:循环限定循环次数或者循环的条件。 当型循环的实现: while 语法 while(循…

【MySQL】索引 【上】 {没有索引的查询/磁盘/mysql与磁盘IO/初识索引}

文章目录 1.没有索引存在的问题2. 认识磁盘MySQL与存储MySQL与磁盘交互基本单位建立共识图解IO认识索引 在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物…

初学Mybatis之缓存

所有的查询都需要连接数据库,而连接数据库消耗资源 我们可以把一次查询的结果暂时存在一个可以直接获取到的地方(内存:缓存) 我们再次查询相同数据的时候,直接走缓存,不走数据库 缓存:存在内…

3.5.1、查找和排序算法-算法介绍

算法特性 算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。简单的说算法就是某个问题的解题思路,算法的五个重要特性如下: 有穷性。一个算法必须总是(对任何合法的输入值…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十二章 设备树常用of函数

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

NAS变身云盘管理大师:群晖部署AList全攻略!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒🔑 AList功能简介🚀 快速部署📝 操作步骤🐳 Docker容器部署:灵活与强大📝 操作步骤📝 群晖部署🎈 获取方式 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 在这个数字化时代,我们似乎都不可避免地拥有多个…

【数据结构】:大厂面试经典链表OJ题目详解

反转链表 206. 反转链表 - 力扣(LeetCode) 思路解透 本题就是通过不停地将最先的 head 节点位置的后一位插到最前面,完成链表的反转 本题需要两个节点变量 cur:其任务就是定位到原 head 节点位置的前一位,然后将自己…

列表(list)—python

一、列表的定义方式 列表内的每一个数据称为元素,列表以[ ]作为标识,列表内的每个元素之间用逗号隔开。 列表的基本语法如下: #字面量 [元素1,元素2,元素3,元素4,……]#定义变量 变量名称[元素1,元素2,元素3,元素4,……]#定义空列表 变量名…

Linux的防火墙

一、防火墙概述 防火墙是一种计算机硬件和软件的结合,使internet和intranet之间建立一个安全网关(Security Gateway),从而保护内网免受非法用户侵入的技术。 防火墙主要由服务访问规则、验证工具、包过滤和应用网关4个部分组成。…

安防视频监控EasyCVR视频汇聚平台无法编辑设备通道信息的原因排查及解决

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台基于云边端一体化架构,兼容性强、支持多协议接入,包括国标GB/T 28181协议、部标JT808、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SD…

ECharts - 坐标轴刻度数值处理

写图表时,Y轴的数值过大,不太可能直接展示,这时候就得简写了,或者百分比展示的也要处理,如下图: yAxis: {type: value,// Y轴轴线axisLine: { show: false }, // 刻度线axisTick: { show: false },// 轴刻度…

ECharts实现按月统计和MTBF统计

一、数据准备 下表是小明最近一年的旅游记录 create_datecity_namecost_money2023-10-10 10:10:10北京14992023-11-11 11:11:11上海29992023-12-12 12:12:12上海19992024-01-24 12:12:12北京1232024-01-24 12:12:12上海2232024-02-24 12:12:12广州5642024-02-24 12:12:12北京…

学习笔记之Java篇(0729)

p 数组 大纲知识点数组的概念数组的定义、四个特点数组的常见操作普通遍历、for-each遍历、java.util.Array类用法多维数组多维数组的内存结构、存储表格、Javabean和数组存储表格常见算法冒泡排序基础算法、冒泡排序优化算法、二分法查找(折半查找) 1、…

【JavaWeb】Filter

基本使用 使用了过滤器之后,要想访问web服务器上的资源,必须先经过滤器,过滤器处理完毕之后,才可以访问对应的资源。过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等。 使用操…

nginx 子路径映射配置

如果子路径转发到另一个服务器IP,配置如下,注意都要以“/”结尾。 #指定nginx进程数 worker_processes 1; pcre_jit on;events {# 连接数上限worker_connections 30000; }#http服务 http {server {listen 20012;# 监听的端口号server_name localho…

Spring IoC DI(笔记)

一.了解SpringIoC&DI 1.1IoC 通过前面的学习,我们知道了Spring是一个开源框架,他让我们的开发更加简单.他支持广泛的应用场 景,有着活跃而庞大的社区,这也是Spring能够长久不衰的原因,但是这个概念相对来说,还是比较抽象,我们用一句更具体的话来概…