在咱们开始以前 , 让咱们作一个快速、高级别审查的核心术语和概念 :html
如今 , 让咱们讨论一下 Spring AOP 和 AspectJ 的轴线 — — 诸如能力、目标、编织、内部结构、链接点和质朴。web
简单来讲 , Spring AOP 和 AspectJ 有不一样的目标。正则表达式
SpringAOP 是 AOP 的简单实现 Spring IoC 来解决该问题 , 最多见的一类。它并不意图做为完整解决方案的 AOP- 它只能应用于被管理的 Bean 时 , Spring 容器。spring
另外一方面 ,AspectJ 是 AOP 技术的原始的 AOP 提供完整解决方案。它更为鲁棒 , 可是也明显多于 Spring AOP 。同时 , 值得注意的是 , 能够应用于全部的 AspectJ 域对象。编程
Spring AOP 和 AspectJ 都使用了不一样类型的编织行为有关 , 严重影响其性能和易用性。浏览器
AspectJ 利用三种不一样类型的编织 :架构
更深刻的信息对 AspectJ 自己 ,看一下这篇文章。框架
做为使用 AspectJ 编译器 classload 织造时间和时间 ,利用 Spring AOP 的运行时编织。编程语言
与运行时编织 , 该编织方面在执行应用程序期间使用代理在目标物品 — — JDK 动态代理或使用代理 (在下面讨论的点) :函数
Spring AOP 是一个基于代理的 AOP 框架。这意味着 , 为了实现这些方面的目标对象 , 它建立代理对象。这是经过使用如下两种方式 :
咱们能够更深刻地了解 Spring AOP 代理的机制官方文档。
AspectJ 中 , 另外一方面 , 起不到任何做用 , 由于类在运行时被编译直接的方面。
Spring AOP 等不一样 , 它不须要任何设计图案。在织造方面 , 介绍了其称为编译 AspectJ 编译器 ( ajc ) , 编译和运行程序 , 而后经过小的 (< 100K).
在 3.3 节中 , 咱们显示 , 基于代理的 Spring AOP 模式。正由于如此 , 它须要 Java 类和子类的对象将横切关注点应用。
但它具备局限性。咱们不能将横切关注点应用类别 (或方面) 的 “最终” , 由于它们不能被重写 , 从而它将致使运行异常。
这一样适用于静态和最终方法。弹簧方面不能应用 , 由于它们不能被重写。所以 , 由于 Spring AOP 的这些限制 , 只支持方法执行链接点。
然而 ,AspectJ 编织将横切关注点直接转换成实际的代码以前运行。Spring AOP 不一样 , 它不须要对象的子类对象 , 并所以支持许多其余的链接点。如下是对支持的链接点 :
Joinpoint | Spring AOP 支持 | AspectJ 支持 |
---|---|---|
呼叫方法 | 没有 | 是的 |
执行方法 | 是的 | 是的 |
调用构造函数 | 没有 | 是的 |
执行构造函数 | 没有 | 是的 |
执行静态初始化器 | 没有 | 是的 |
对象初始化 | 没有 | 是的 |
参考场 | 没有 | 是的 |
外勤任务 | 没有 | 是的 |
执行处理程序 | 没有 | 是的 |
执行建议 | 没有 | 是的 |
值得注意的是在 spring aop 中 , 问题不是所谓的方法应用于同一类别。
这是由于 , 当咱们调用在同一个类中定义的方法 , 则不调用该方法 , Spring AOP 的代理提供。若是咱们须要这个功能 , 那么咱们必须定义一个不一样的咖啡豆中分离方法 , 或者使用 AspectJ 。
Spring AOP 是明显更简单 , 由于它不引入任何额外的编译器或编织器之间的编译过程。它使用运行时编织 , 所以咱们一般无缝集成与构建过程。虽然它看上去很简单 , 它只经过弹簧托管 bean 。
然而 , 使用 AspectJ , 咱们须要采用 AspectJ 编译器 ( ajc ) 和从新封装库 ( 除非咱们全部咱们切换到编译后或装入时编织的状况下) 。
固然 , 比前者更复杂 , 由于它介绍了 AspectJ 工具 (包括 Java 编译器 ( ajc ) 、调试器 (ajdb ) 、文件生成器 (ajdoc) 、浏览器程序 ajbrowser 结构 ()) , 咱们须要集成或与 IDE 中的构建工具。
就表演而言 ,编译时编织的运行时编织。Spring AOP 是一个基于代理的架构 , 使得代理的存在时启动应用。此外 , 还有几个方面每一个方法调用 , 这影响了性能。
另外一方面 , AspectJ 中的方面编织到主代码在应用程序执行以前 , 没有额外的运行时开销 , 不像 Spring AOP 。
因为这些缘由 ,基准AspectJ 是几乎认为大约 8 到 35 倍 Spring AOP 。
这个表快速汇总了主要差别, Spring AOP 和 AspectJ 之间进行 :
Spring AOP | AspectJ |
---|---|
用纯 Java | 使用 Java 编程语言的扩展 |
不须要单独的编码过程 | 须要 AspectJ 编译器 ( ajc ) 除非 LTW 设置 |
惟一可用的运行时编织 | 织造运行时不可用。支持编译 , 编译后 , 加载时织入 |
更强大 — — 只支持织制方法 | 更可编织更强大 — — 字段、方法、构造函数、静态初始化器 , 最终类 / 方法等 … |
能够只针对 bean 的 Spring 容器管理 | 能够实现对全部域对象 |
仅支持执行切入点方法 | 全部支持的切入点 |
代理建立的目标对象 , 同时也应用在这些代理 | 方面的编织直接转换成代码以前执行应用程序 (在运行时以前) |
AspectJ 慢得多 | 更好的性能 |
简单易学适用 | 相对更复杂的是 Spring AOP |
若是咱们在全部分析的论点 , 咱们就会明白 , 这根本没有那么一个框架比另外一种更好。
简单来讲 , 在很大程度上取决于咱们的选择要求 :