iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Aspectj与Spring AOP的对比分析
  • 439
分享到

Aspectj与Spring AOP的对比分析

2024-04-02 19:04:59 439人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

1、简介 今天有多个可用的 aop 库, 它们需要能够回答许多问题: 1、是否与用户现有的或新的应用程序兼容? 2、在哪里可以实现 AOP? 3、与自己的应用程序集成多快? 4、性能

1、简介

今天有多个可用的 aop 库, 它们需要能够回答许多问题:

1、是否与用户现有的或新的应用程序兼容?

2、在哪里可以实现 AOP?

3、与自己的应用程序集成多快?

4、性能开销是多少?

在本文中, 我们将研究如何回答这些问题, 并介绍 spring aop 和 AspectJ, 这是 Java 的两个最受欢迎的 aop 框架

2、AOP概念

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

Aspect —— 一种标准代码/功能, 分散在应用程序中的多个位置, 通常与实际的业务逻辑不同 (例如, 事务管理)。每个方面都侧重于特定的跨裁剪功能

Joinpoint —— 它是执行程序 (如方法执行、构造函数调用或字段分配) 期间的特定点

Advice —— 特定 joinpoint 中的方面所采取的行动

Pointcut —— 与 joinpoint 匹配的正则表达式。每次连接点与切入点匹配时, 都将执行与该切入点关联的指定建议。

Weaving —— 将各方面与目标对象链接起来以创建建议对象的过程

3、Spring AOP 和 AspectJ

现在, 让我们在一些维度上讨论 Spring AOP 和 AspectJ —— 例如功能、目标、Weaving(织入)、内部结构、joinpoints 和简单性。

3.1、能力和目标

简单地说, Spring AOP 和 AspectJ 有不同的目标。

Spring aop 旨在提供一个跨 Spring ioc 的简单的 aop 实现, 以解决程序员面临的最常见问题。它不打算作为一个完整的 AOP 解决方案 —— 它只能应用于由 Spring 容器管理的 bean。

另一方面, AspectJ 是原始的 aop 技术, 目的是提供完整的 aop 解决方案。它更健壮, 但也比 Spring AOP 复杂得多。还值得注意的是, AspectJ 可以在所有域对象中应用。

3.2、Weaving(织入)

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

AspectJ 使用三种不同类型的Weaving:

编译时 Weaving: AspectJ 编译器作为输入我们的方面的源代码和我们的应用, 并产生一个织入类文件作为输出;

编译后 Weaving: 这也称为二进制织入。它是用来织入现有的类文件和 jar 文件与我们的方面;

加载时间 Weaving: 这就像前二进制织入, 不同的是织入被推迟, 直到类加载程序加载类文件到 JVM

要了解更多关于 AspectJ 本身的详细信息, 请 阅读此文。

当 AspectJ 使用编译时和class文件加载时织入时,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、Joinpoints

在3.3 节中, 我们显示了 Spring AOP 是基于代理模式的。因此, 它需要将目标 Java 类分类, 并相应地应用交叉问题。

但这是有限制的。我们不能在 "最终" 类中应用交叉问题 (或方面), 因为它们不能被重写, 因此会导致运行时异常。

同样适用于静态和最终方法。不能将 Spring 方面应用于它们, 因为它们不能被覆盖。因此, 由于这些限制, Spring AOP 只支持方法执行连接点。

然而, AspectJ 在运行前直接将横切关注点编织到实际代码中。与 Spring AOP 不同, 它不需要对目标对象进行子类, 因此也支持许多其他 joinpoints。

以下是支持的 joinpoints 的摘要:

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 中, aspects不应用于在同一个类中相互调用的方法。

这显然是因为当我们调用同一类中的方法时, 我们就不会调用 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
在纯 Java 中实现 使用 Java 编程语言的扩展实现
不需要单独的编译过程 除非设置 LTW,否则需要 AspectJ 编译器 (ajc)
只能使用运行时织入 运行时织入不可用。支持编译时、编译后和加载时织入
功能不强-仅支持方法级编织 更强大 - 可以编织字段、方法、构造函数、静态初始值设定项、最终类/方法等......。
只能在由 Spring 容器管理的 bean 上实现 可以在所有域对象上实现
仅支持方法执行切入点 支持所有切入点
代理是由目标对象创建的, 并且切面应用在这些代理上 在执行应用程序之前 (在运行时) 前, 各方面直接在代码中进行织入
比 AspectJ 慢多了 更好的性能
易于学习和应用 相对于 Spring AOP 来说更复杂

5、选择正确的框架

如果我们分析了本节中提出的所有论点, 我们就会开始理解, 一个框架比另一个架构更好。

简单地说, 选择很大程度上取决于我们的要求:

框架: 如果应用程序没有使用 spring 框架, 那么我们就别无选择, 只能放弃使用 spring AOP 的想法, 因为它无法管理任何超出 spring 容器范围的东西。但是, 如果我们的应用程序是完全使用 spring 框架创建的, 那么我们可以使用 spring AOP, 因为它是简单的学习和应用

灵活性: 由于有限的 joinpoint 支持, Spring aop 不是一个完整的 aop 解决方案, 但它解决了程序员面临的最常见的问题。尽管如果我们想深入挖掘和开发 AOP 以达到其最大能力, 并希望得到广泛的可用 joinpoints 的支持, 那么最好选择 AspectJ

性能: 如果我们使用的是有限的切面, 那么就会有细微的性能差异。但有时, 应用程序有成千上万个切面的情况。我们不想在这样的情况下使用运行时编织, 所以最好选择 AspectJ。AspectJ 已知的速度比 Spring AOP 快8到35倍

两者的最佳之处: 这两个框架都是完全兼容的。我们总是可以利用 Spring AOP; 只要有可能, 仍然可以在不支持前者的地方使用 AspectJ 获得支持

6、结论

在本文中, 我们分析了 Spring AOP 和 AspectJ 的几个关键领域。

我们比较了两种 AOP 方法的灵活性, 以及它们将如何轻松地适应我们的应用程序。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Aspectj与Spring AOP的对比分析

本文链接: https://www.lsjlt.com/news/128219.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Aspectj与Spring AOP的对比分析
    1、简介 今天有多个可用的 AOP 库, 它们需要能够回答许多问题: 1、是否与用户现有的或新的应用程序兼容? 2、在哪里可以实现 AOP? 3、与自己的应用程序集成多快? 4、性能...
    99+
    2024-04-02
  • Spring基于AspectJ的AOP开发案例解析
    目录AspectJ简介注解开发环境准备不同的通知类型最通知中通过value属性定义切点入门案列@Before前置通知@AfterReturning后置通知@Around环绕通知@Af...
    99+
    2024-04-02
  • SpringAOP与AspectJ的对比及应用详解
    目录1 简介2 Spring AOP vs AspectJ2.1 织入方式2.2 Joinpoints2.3 性能3 Spring Boot使用AspectJ3.1 引入依赖3.2 ...
    99+
    2023-02-08
    Spring AOP对比AspectJ Spring AOP AspectJ
  • Spring-AOP @AspectJ进阶之如何绑定代理对象
    概述 使用this()或target()可绑定被代理对象实例,在通过类实例名绑定对象时,还依然具有原来连接点匹配的功能,只不过类名是通过增强方法中同名入参的类型间接决定罢了。 这里我...
    99+
    2024-04-02
  • Spring-AOP @AspectJ切点函数@annotation()的用法
    这篇文章主要讲解了“Spring-AOP @AspectJ切点函数@annotation()的用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring-AOP @AspectJ切点函数...
    99+
    2023-06-20
  • Spring AOP的示例分析
    这篇文章主要为大家展示了“Spring AOP的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Spring AOP的示例分析”这篇文章吧。Spring中对AOP的支持Spring中AOP...
    99+
    2023-05-30
    spring aop
  • Spring之AOP两种代理机制对比分析(JDK和CGLib动态代理)
    目录Spring AOP两种代理机制对比JDK动态代理CGLib动态代理SpringAOP两种代理原理SpringAOP代理JDK动态代理CGLIB代理两者对比使用注意总结Sprin...
    99+
    2023-05-19
    Spring AOP AOP代理机制 JDK动态代理 CGLib动态代理
  • C语言与Python的对比与分析
    C语言与Python的对比与分析 C语言和Python是两种不同的编程语言,各有优点和适用场景。C语言作为一种底层语言,被广泛应用于系统编程、嵌入式开发等领域,具有高效性和灵活性的特点...
    99+
    2024-04-02
  • hive与rdbms对比的分析说明
    这篇文章给大家分享的是有关hive与rdbms对比的分析说明的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Hive并非为联机事务处理而设计,Hive并不提供实时的查询和基于行级的数据更新操作。Hive是建立在Ha...
    99+
    2023-06-03
  • Spring中IOC和AOP的示例分析
    小编给大家分享一下Spring中IOC和AOP的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Spring是一个开源框架,主要实现两件事,IOC(控制反转...
    99+
    2023-05-30
    spring ioc aop
  • MySQL中InnoDB与MyISAM的对比分析
    小编给大家分享一下MySQL中InnoDB与MyISAM的对比分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!对比InnoDB与MyISAM1、 存储结构MyI...
    99+
    2023-06-27
  • Pytorch中Softmax与LogSigmoid的对比分析
    Pytorch中Softmax与LogSigmoid的对比 torch.nn.Softmax 作用: 1、将Softmax函数应用于输入的n维Tensor,重新改变它们的规格,使n维...
    99+
    2024-04-02
  • Clojure与Java对比实例分析
    这篇文章主要介绍“Clojure与Java对比实例分析”,在日常操作中,相信很多人在Clojure与Java对比实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Clojure与Java对比实例分析”的疑...
    99+
    2023-07-02
  • TypeScript与JavaScript对比及打包工具对比分析
    这篇文章主要介绍了TypeScript与JavaScript对比及打包工具对比分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇TypeScript与JavaScript对比及打包工具对比分析文章都会有所收获,...
    99+
    2023-07-05
  • SpringBoot与Spring之间的对比
    目录SpringBoot与Spring之间对比原有Spring优缺点分析SpringBoot的概述SpringBoot的核心功能SpringBoot与springcloud版本对应关...
    99+
    2023-02-23
    SpringBoot与Spring的对比 SpringBoot与Spring SpringBoot Spring
  • Component与PureComponent对比源码分析
    这篇文章主要介绍了Component与PureComponent对比源码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Component与PureComponent对比源码分析文章都会有所收获,下面我们一起...
    99+
    2023-07-05
  • Spring AOP实现原理的示例分析
    这篇文章将为大家详细讲解有关Spring AOP实现原理的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是AOPAOP(Aspect-OrientedProgramming,面向方面编程),可...
    99+
    2023-05-30
    spring aop
  • 同步与异步:Python与Laravel的对比分析
    在现代的软件开发中,同步和异步是两个重要的概念。同步指的是程序在执行某个任务时,必须等待该任务完成后才能执行下一个任务。而异步则是指程序在执行某个任务时,可以继续执行其他任务,不必等待该任务完成。Python和Laravel是两种常用的编...
    99+
    2023-09-16
    并发 同步 laravel
  • Spring使用AspectJ的注解式实现AOP面向切面编程
    目录1、认识Spring AOP1.1 AOP的简介1.2 AOP中的概念 切入点(pointcut):2、认识AspectJ 2.1 AspectJ的简介2.2 Spring AO...
    99+
    2024-04-02
  • PHP、Spring、Django存储方案的比较与分析
    PHP、Spring、Django是当下最为流行的Web开发框架之一,它们都提供了相应的存储方案,以满足不同开发者的需求。本文将对这三种存储方案进行比较与分析,并给出相应的演示代码,帮助读者更好地了解它们的优缺点。 PHP存储方案 PH...
    99+
    2023-09-25
    存储 spring django
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作