当前位置: 首页 > article >正文

比较Spring AOP和AspectJ

1. 介绍

当前有多个可用的AOP库,这些库必须能够回答许多问题:

  • 它与我现有的或新的应用程序兼容吗?
  • 在哪里可以实施AOP?
  • 它与我的应用程序集成的速度有多快?
  • 性能开销是多少?

在本文中,我们将着眼于回答这些问题,并介绍Spring AOP和AspectJ(这两种最流行的Java AOP框架)。

2. AOP 概念

在开始之前,让我们对术语和核心概念进行快速的高层次审查:

  • 切面–一种标准代码/功能,分散在应用程序的多个位置,通常与实际的业务逻辑(例如,事务管理)不同。每个方面都专注于特定的跨领域功能
  • 连接点–这是程序执行过程中的特定点,例如方法执行,构造函数调用或字段分配
  • 通知–方面在特定联接点中采取的操作
  • 切入点–与联接点匹配的正则表达式。每当任何连接点与切入点匹配时,都会执行与该切入点关联的指定建议
  • 编织–将方面与目标对象链接以创建建议对象的过程

3.Spring AOP 和AspectJ

现在,让我们从多个角度讨论Spring AOP和AspectJ,例如功能,目标,编织,内部结构,连接点和简单性

3.1 能力和目标

简而言之,Spring AOP和AspectJ具有不同的目标。 Spring AOP旨在在Spring IoC上提供一个简单的AOP实现,以解决程序员面临的最常见问题。它不打算用作完整的AOP解决方案-只能应用于由Spring容器管理的bean。 另一方面,AspectJ是原始的AOP技术,旨在提供完整的AOP解决方案。它比Spring AOP更强大,但也更复杂。还值得注意的是,AspectJ可以应用于所有域对象。

3.2 编织

AspectJ和Spring AOP都使用不同类型的编织,这会影响它们在性能和易用性方面的行为。 AspectJ使用三种不同的编织方式:

  1. 编译时编织:AspectJ编译器将方面和应用程序的源代码都作为输入,并生成编织类文件作为输出
  2. 编译后编织:这也称为二进制编织。它用于与我们的方面编织现有的类文件和JAR文件
  3. 加载时编织:这与以前的二进制编织完全一样,不同之处在于编织被推迟到类加载器将类文件加载到JVM为止

有关AspectJ本身的更多信息,请继续阅读本文。 由于AspectJ使用编译时和类加载时编织,因此Spring AOP使用运行时编织。 通过运行时编织,可以在应用程序执行期间使用目标对象的代理来编织各方面–使用JDK动态代理或CGLIB代理(将在下一部分中进行讨论):

在这里插入图片描述

3.3 内部结构与应用

Spring AOP是基于代理的AOP框架。这意味着要实现目标对象的各个方面,它将创建该对象的代理。这可以通过以下两种方式之一来实现:

  1. JDK动态代理– Spring AOP的首选方式。每当目标对象实现一个接口时,都将使用JDK动态代理
  2. CGLIB代理–如果目标对象未实现接口,则可以使用CGLIB代理

我们可以从官方文档中了解有关Spring AOP代理机制的更多信息。 另一方面,AspectJ在运行时不执行任何操作,因为类是直接用方面编译的。 因此,与Spring AOP不同,它不需要任何设计模式。为了将代码的各个方面编织起来,它引入了称为AspectJ编译器(ajc)的编译器,通过它我们可以编译程序,然后通过提供一个小的(<100K)运行时库来运行它。

3.4 连接点

在3.3节中,我们展示了Spring AOP基于代理模式。因此,它需要对目标Java类进行子类化,并相应地应用跨领域关注点。 但是它有一个局限性。我们不能跨“最终”类应用跨领域关注点(或方面),因为它们不能被覆盖,因此会导致运行时异常。 静态方法和最终方法也是如此。 Spring方面不能应用于它们,因为它们不能被覆盖。因此,由于这些限制,Spring AOP仅支持方法执行连接点。 但是,AspectJ在运行时之前将横切关注点直接编织到实际代码中。与Spring AOP不同,它不需要子类化目标对象,因此也支持许多其他连接点。以下是受支持的连接点的摘要:

Joinpoint

Spring AOP Supported

AspectJ Supported

Method Call

No

Yes

Method Execution

Yes

Yes

Constructor Call

No

Yes

Constructor Execution

No

Yes

Static initializer execution

No

Yes

Object initialization

No

Yes

Field reference

No

Yes

Field assignment

No

Yes

Handler execution

No

Yes

Advice execution

No

Yes

还值得注意的是,在Spring AOP中,方面未应用于同一类中调用的方法。 显然,这是因为当我们在同一类中调用方法时,便没有调用Spring AOP提供的代理方法。如果需要此功能,则必须在不同的bean中定义一个单独的方法,或使用AspectJ。

3.5 简单

Spring AOP显然更简单,因为它在构建过程之间没有引入任何额外的编译器或编织器。它使用运行时编织,因此可以与我们通常的构建过程无缝集成。尽管看起来很简单,但是它仅适用于Spring管理的bean。 但是,要使用AspectJ,我们需要引入AspectJ编译器(ajc)并重新打包所有库(除非我们切换到后编译或加载时编织)。 当然,这比前者要复杂得多,因为它引入了AspectJ Java工具(包括编译器(ajc),调试器(ajdb),文档生成器(ajdoc),程序结构浏览器(ajbrowser)),需要与我们的IDE或构建工具集成。

3.6 性能

就性能而言,编译时编织比运行时编织快得多。 Spring AOP是基于代理的框架,因此在应用程序启动时会创建代理。此外,每个方面还有更多方法调用,这会对性能产生负面影响。 另一方面,AspectJ在应用程序执行之前将各方面编织到主代码中,因此与Spring AOP不同,没有额外的运行时开销。 由于这些原因,基准测试表明AspectJ几乎比Spring AOP快8到35倍。

4. 摘要

下表概述了Spring AOP和AspectJ之间的主要区别:

Spring AOP

AspectJ

Implemented in pure Java-- 用纯Java实现

Implemented using extensions of Java programming language-- 使用Java编程语言的扩展实现

No need for separate compilation process-- 无需单独的编译过程

Needs AspectJ compiler (ajc) unless LTW is set up-- 除非设置了LTW,否则需要AspectJ编译器(ajc)

Only runtime weaving is available-- 仅需运行时编织

Runtime weaving is not available. Supports compile-time, post-compile, and load-time Weaving-- 运行时编织不可用。支持编译时,后编译和加载时编织

Less Powerful – only supports method level weaving-- 不足–仅支持方法级编织

More Powerful – can weave fields, methods, constructors, static initializers, final class/methods, etc…–更强大–可以编织字段,方法,构造函数,静态初始值设定项,最终类/方法等…

Can only be implemented on beans managed by Spring container-- 只能在Spring容器管理的bean上实现

Can be implemented on all domain objects-- 可以在所有领域对象上实施

Supports only method execution pointcuts-- 仅支持方法执行切入点

Support all pointcuts-- 支持所有切入点

Proxies are created of targeted objects, and aspects are applied on these proxies-- 代理是针对目标对象创建的,并且方面已应用于这些代理

Aspects are weaved directly into code before application is executed (before runtime)–在应用程序执行之前(运行时之前)将方面直接编织到代码中

Much slower than AspectJ-- 比AspectJ慢得多

Better Performance-- 更好的性能

Easy to learn and apply-- 易于学习和应用

Comparatively more complicated than Spring AOP-- 比Spring AOP复杂得多

5. 选择正确的框架

如果我们分析本节中提出的所有论点,就会开始理解,一个框架根本不比另一个框架更好。 简而言之,选择很大程度上取决于我们的要求:

  • 框架:如果应用程序未使用Spring框架,那么我们别无选择,只能放弃使用Spring AOP的想法,因为它无法管理Spring容器无法达到的任何功能。但是,如果我们的应用程序是完全使用Spring框架创建的,那么我们可以使用Spring AOP,因为它易于学习和应用
  • 灵活性:鉴于有限的连接点支持,Spring AOP并不是完整的AOP解决方案,但它解决了程序员面临的最常见问题。尽管如果我们想更深入地挖掘和利用AOP的最大功能,并希望获得广泛的可用连接点的支持,那么AspectJ是一个不错的选择
  • 性能:如果我们使用的方面有限,则性能上将存在微不足道的差异。但是有时在应用程序具有成千上万个方面的情况下。在这种情况下,我们不想使用运行时编织,因此最好选择AspectJ。已知AspectJ比Spring AOP快8到35倍
  • 两者兼有:这两个框架彼此完全兼容。我们总是可以尽可能利用Spring AOP,并且仍然使用AspectJ来获得前者不支持的连接点的支持。

6. 结论

在本文中,我们在几个关键领域分析了Spring AOP和AspectJ。 我们比较了两种AOP方法的灵活性以及它们与我们的应用的适应性。

相关文章:

比较Spring AOP和AspectJ

1. 介绍 当前有多个可用的AOP库&#xff0c;这些库必须能够回答许多问题&#xff1a; 它与我现有的或新的应用程序兼容吗&#xff1f;在哪里可以实施AOP&#xff1f;它与我的应用程序集成的速度有多快&#xff1f;性能开销是多少&#xff1f; 在本文中&#xff0c;我们将着眼…...

Spring Boot 异步编程

在 Spring Boot 中&#xff0c;异步编程可以显著提高应用程序的性能和响应能力&#xff0c;特别是在处理一些耗时的操作时。下面将详细介绍 Spring Boot 异步编程中异步方法的使用、线程池配置以及异步任务的监控与管理。 1. 异步方法的使用 步骤 1&#xff1a;启用异步支持 …...

现今大语言模型性能(准确率)比较

现今大语言模型性能(准确率)比较 表头信息:表的标题为“大语言模型性能比较结果”(英文:Table 1: Large Language Model Performance Comparison Results),表明该表是用于对比不同大语言模型的性能。列信息: 模型:列出参与比较的不同大语言模型名称,包括LLAMA3(70B)…...

(十 五)趣学设计模式 之 命令模式!

目录 一、 啥是命令模式&#xff1f;二、 为什么要用命令模式&#xff1f;三、 策略模式的实现方式四、 命令模式的优缺点五、 命令模式的应用场景六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;可以多多支…...

React低代码项目:问卷编辑器 I

问卷编辑器 Date: February 20, 2025 4:17 PM (GMT8) 目标 完成问卷编辑器的设计和开发完成复杂系统的 UI 组件拆分完成复杂系统的数据结构设计 内容 需求分析技术方案设计开发 注意事项&#xff1a; 需求指导设计&#xff0c;设计指导开发。前两步很重要页面复杂的话&…...

信刻光盘安全隔离与信息交换系统让“数据摆渡”安全高效

随着数据传输、存储及信息技术的飞速发展&#xff0c;信息安全保护已成为重中之重。各安全领域对跨网数据交互的需求日益迫切&#xff0c;数据传输的安全可靠性成为不可忽视的关键。为满足业务需求并遵守保密规范&#xff0c;针对于涉及重要秘密信息&#xff0c;需做到安全的物…...

使用Python自动生成图文并茂的网页分析报告

在数据分析中&#xff0c;不管是市场研究还是科学分析&#xff0c;经常需要使用Python进行数据分析并生成图表报告。一般使用Python生成和展示图表时都是使用matplotlib 库生成静态图片文件&#xff0c;这种方式不便之处是不方便跟动态文字段落结合在一起&#xff0c;也不方便分…...

uniapp 系统学习,从入门到实战(七)—— 网络请求与数据交互

全篇大概 3600 字(含代码)&#xff0c;建议阅读时间 25min &#x1f4da; 目录 使用uni.request发起请求封装全局请求工具破解跨域难题总结 在跨平台应用开发中&#xff0c;网络请求是连接前端与后端服务的核心环节。UniApp 提供了 uni.request 方法处理网络请求&#xff0c;但…...

【项目管理】基于 C 语言的 QQ 聊天室实现(TCP + 多线程 + SQLite3)

基于 C 语言的 QQ 聊天室(TCP + 多线程 + SQLite3) 项目功能基础功能: 登录、注册、添加好友、私聊、创建群聊、群聊扩展功能: 删除好友、注销账号、好友在线状态、群管理(拉人/踢人)、VIP 特权、邮件通知等 功能介绍:模拟QQ聊天客户端:登录界面:1、登录2、注册 //将用…...

力扣27.移除元素(双指针)

题目看起来很乱&#xff0c;实际上意思是&#xff1a;把数组中值不等于val的元素放在下标为0,1,2,3......&#xff0c;并且返回数组中值不等于val的元素的个数 方法一&#xff1a;直接判断覆盖 class Solution { public:int removeElement(vector<int>& nums, int…...

VADv2: 基于矢量表征和概率规划的E2E架构

1. 写在前面 今天分享一篇自动驾驶领域的论文VADv2(End-to-End Vectorized Autonomous Driving via Probabilistic Planning), 基于矢量表征和概率规划的E2E架构,2024年2月份华中科技大和地平线合作的一篇文章, 在经典的端到端模型架构上作出了基于概率规划去输出规划轨迹的…...

机器学习:强化学习的epsilon贪心算法

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是一种机器学习方法&#xff0c;旨在通过与环境交互&#xff0c;使智能体&#xff08;Agent&#xff09;学习如何采取最优行动&#xff0c;以最大化某种累积奖励。它与监督学习和无监督学习不同&#xff0c;强调试错…...

授权与认证之jwt(一)创建Jwt工具类

JWT的Token要经过加密才能返回给客户端&#xff0c;包括客户端上传的Tokn,后端项目需要验证核 实。于是我们需要一个WT工具类&#xff0c;用来加密Token和验证Token的有效性。 一、导入依赖 <dependency><groupId>com.auth0</groupId><artifactId>jav…...

计算机毕业设计SpringBoot+Vue.js基于JAVA语言的在线考试与学习交流网页平台(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

Difyにboto3を変更したカスタムDockerイメージの構築手順

Difyにboto3を変更したカスタムDockerイメージの構築手順 はじめに1. Dockerfileの作成2. Dockerイメージのビルド3. docker-compose.yamlの更新変更点&#xff1a; 4. コンテナの再起動注意事項まとめ はじめに DifyのDockerイメージに特定バージョンのboto3を変更する手順を…...

uniapp 中引入使用uView UI

文章目录 一、前言&#xff1a;选择 uView UI的原因二、完整引入步骤1. 安装 uView UI2. 配置全局样式变量&#xff08;关键&#xff01;&#xff09;3. 在 pages.json中添加&#xff1a;4. 全局注册组件5. 直接使用组件 五、自定义主题色&#xff08;秒换皮肤&#xff09; 一、…...

数据图表ScottPlot.WPF用法示例

目录 一、添加 NuGet 程序包&#xff08;5.0.47&#xff09; 二、MainWindow.xaml中添加引用 三、MainWindow.xaml.cs 具体使用代码 图表示例&#xff1a; 一、添加 NuGet 程序包&#xff08;5.0.47&#xff09; 二、MainWindow.xaml中添加引用 <Window x:Class"…...

js加密之延伸requestAnimationFrame

简言 上篇文章有提到requestAnimationFrame,只是随笔带过。这篇文章就着重研究一下requestAnimationFrame的运用&#xff0c;以及实际作用。还有关于在js加密技术中的落地实现可行性。 功能说明 小声说一下,做开发的同学一定要学会翻官方文档,我这里直接引用一段官方介绍。 …...

系统架构设计师—计算机基础篇—存储管理

文章目录 基本概念地址重定位 存储管理方案分区存储管理分页存储管理做题的方法地址重定位淘汰页号 分段存储管理段页式存储管理虚拟存储管理 基本概念 地址重定位 地址重定位是指将程序中的虚拟地址&#xff08;逻辑地址&#xff09;变换称内存的真实地址&#xff08;物理地…...

【第二十五周】:DeepPose:通过深度神经网络实现人体姿态估计

DeepPose 摘要Abstract文章信息引言DeepPose归一化网络结构初始网络&#xff08;粗略估计所有关节点位置&#xff09;精细化级联网络&#xff08;分别修正每个关节点的位置&#xff09; 疑问与解决代码实践总结 摘要 这篇博客介绍了DeepPose&#xff0c;这是首个基于深度神经网…...

SVN 简介

SVN 简介 引言 版本控制系统(Version Control System,VCS)是软件开发过程中不可或缺的工具之一。它能够帮助开发者管理代码的版本,追踪代码变更,协同工作,以及确保代码的稳定性和安全性。Subversion(简称SVN)是一种流行的版本控制系统,本文将为您详细介绍SVN的基本概…...

ARM Linux LCD上实时预览摄像头画面

文章目录 1、前言2、环境介绍3、步骤4、应用程序编写4.1、lcd初始化4.2、摄像头初始化4.3、jpeg解码4.4、开启摄像头4.5、完整的程序如下 5、测试5.1、编译应用程序5.2、运行应用程序 6、总结 1、前言 本次应用程序主要针对支持MJPEG格式输出的UVC摄像头。 2、环境介绍 rk35…...

基于DeepSeek 的图生文最新算法 VLM-R1

目录 一、算法介绍 二 算法部署 三 模型下载 四 算法测试 五 可视化脚本 一、算法介绍 VLM-R1:稳定且可通用的 R1 风格大型视觉语言模型 自从 Deepseek-R1 推出以来,出现了许多专注于复制和改进它的作品。在这个项目中,我们提出了 VLM-R1,一种稳定且可通用的 R1 风格…...

《论软件测试中缺陷管理及其应用》审题技巧 - 系统架构设计师

论软件测试中缺陷管理及其应用写作框架 一、考点概述 本论题“论软件测试中缺陷管理及其应用”主要考查的是软件测试领域中的缺陷管理相关知识与实践应用。论题涵盖了以下几个核心内容: 首先,需要理解软件缺陷的基本概念,即软件中存在的破坏正常运行能力的问题、错误或隐…...

MacOS本地部署Deepseek,不联网也可以使用AI,保护隐私

苹果笔记本本地部署deepseek主要用到Ollama与open-webui 1. 安装Ollama “Ollama” 是一个轻量级的 AI 模型运行时环境&#xff08;runtime&#xff09;&#xff0c;旨在简化在本地部署和使用大语言模型&#xff08;LLM&#xff09;的过程。它由 Vicarious 公司开发&#xff…...

python爬虫:pyspider的详细使用

文章目录 一、pyspider介绍1.1 核心概念1.2 与其他爬虫框架的比较二、 安装 pyspider三、编写爬虫脚本四、运行和监控爬虫4.1 启动爬虫4.2 监控任务状态4.3 任务管理五、高级功能5.1 分布式爬取5.2 JavaScript 渲染5.3 数据存储5.4 定时任务5.5 错误处理和重试机制六、示例:采…...

3-5 WPS JS宏 工作表的移动与复制学习笔记

************************************************************************************************************** 点击进入 -我要自学网-国内领先的专业视频教程学习网站 *******************************************************************************************…...

Sqlserver安全篇之_启用TLS即配置SQL Server 数据库引擎以加密连接

官方文档 https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/configure-sql-server-encryption?viewsql-server-ver16 https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/manage-certificates?viewsql-server-ver15&pre…...

删除变慢问题

问题&#xff1a; 有一个场景&#xff0c;每天都会删除数据&#xff0c;SQL为delete from xxx where record_date < DATE_SUB(now(), INTERVAL ? DAY) limit 1000 &#xff0c;一直循环执行&#xff0c;当执行到最后一次满足条件的时候&#xff0c;就会很慢 原理分析 索引与…...

创建一个MCP服务器,并在Cline中使用,增强自定义功能。

MCP介绍 MCP 是一个开放协议&#xff0c;它标准化了应用程序如何向LLMs提供上下文。可以将 MCP 视为 AI 应用程序的 USB-C 端口。正如 USB-C 提供了一种标准化的方法来将您的设备连接到各种外围设备和配件一样&#xff0c;MCP 提供了一种标准化的方法来将 AI 模型连接到不同的…...