AOP 概念

在我们开始之前 , 让我们做一个快速、高级别审查的核心术语和概念 :

  • 方面 — —标准 / 特征代码被分散在多个场所中的应用 , 通常不同于实际的业务逻辑 (例如 , 交易管理) 。各方面集中于特定的切割功能
  • Joinpoint –它的具体执行过程中程序的执行等方法 , 调用构造函数或赋值域
  • 建议采取的行动方面在特定 Joinpoint
  • 切入点 — — Joinpoint 正则表达式来匹配的。每个时间点加入任何匹配的切入点 , 这个切入点建议相关规定执行
  • 织造 – 的手续方面的针对性建议对象创建一个对象

Spring AOP 和 AspectJ

现在 , 让我们讨论一下 Spring AOP 和 AspectJ 的轴线 — — 诸如能力、目标、编织、内部结构、连接点和质朴。

能力和目标

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

SpringAOP 是 AOP 的简单实现 Spring IoC 来解决该问题 , 最常见的一类。它并不意图作为完整解决方案的 AOP- 它只能应用于被管理的 Bean 时 , Spring 容器。

另一方面 ,AspectJ 是 AOP 技术的原始的 AOP 提供完整解决方案。它更为鲁棒 , 但是也明显多于 Spring AOP 。同时 , 值得注意的是 , 可以应用于所有的 AspectJ 域对象。

织造

Spring AOP 和 AspectJ 都使用了不同类型的编织行为有关 , 严重影响其性能和易用性。

AspectJ 利用三种不同类型的编织 :

  1. 编译时编织AspectJ 编译器 : 输入源代码的应用方面我们和我们的生产和织造类文件作为输出
  2. 织造后编译这也被称为二进制编织。它是用于现有类文件和 JAR 文件 , 我们方面
  3. 装载时织入这正是 : 像原来的二进制编织 , 与编织的差 , 直至类加载器加载到 JVM 中的类文件

更深入的信息对 AspectJ 本身 ,看一下这篇文章

作为使用 AspectJ 编译器 classload 织造时间和时间 ,利用 Spring AOP 的运行时编织

与运行时编织 , 该编织方面在执行应用程序期间使用代理在目标物品 — — JDK 动态代理或使用代理 (在下面讨论的点) :

内部结构和应用

Spring AOP 是一个基于代理的 AOP 框架。这意味着 , 为了实现这些方面的目标对象 , 它创建代理对象。这是通过使用以下两种方式 :

  1. JDK 的动态代理 AOP 方式优选为弹簧。即使当目标对象实现一个接口 , 然后使用 JDK 动态代理
  2. CGLIB 代理 – 如果目标对象不实现接口 , 则代理可以使用

我们可以更深入地了解 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

选择合适的框架

如果我们在所有分析的论点 , 我们就会明白 , 这根本没有那么一个框架比另一种更好。

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

  • 框架 : 如果不使用 Spring 框架 , 然后我们就别无选择 , 只能放弃这个想法 , 因为它使用的是 Spring AOP 不能管理任何弹簧之外的容器。然而 , 如果我们应用全部创建使用 Spring 框架 , 然后我们可以使用 Spring AOP 的简单的学习和应用
  • 灵活性 : Joinpoint 有限的支持 , 是不完整的 Spring AOP 面向方面编程 (AOP) 的解决方案 , 但它解决了问题 , 最常见的一类。但如果我们想要更深入地挖掘和利用 AOP 以其最大能力的支持 , 希望从广泛可用的连接点 , 则是选择了 AspectJ
  • 表现 : 如果我们使用有限的方面 , 则有轻微的性能差异。但有时会因申请以上几方面。我们不希望使用这种运行时编织的情况下 , 还是选择了 AspectJ 。AspectJ 是 8 至 35 倍 Spring AOP
  • 最好的 : 这些框架的完全兼容。我们总是可以利用 Spring AOP 和 AspectJ 使用时仍可能得到支撑的连接点不支持由前任

Comparing Spring AOP and AspectJ的更多相关文章

  1. 比较 Spring AOP 与 AspectJ

    本文翻译自博客Comparing Spring AOP and AspectJ(转载:https://juejin.im/post/5a695b3cf265da3e47449471) 介绍 如今有多个 ...

  2. Spring AOP With AspectJ

    一.AOP和拦截器 某些情况下,AOP和拦截器包括Filter能够实现同样的功能,一般都是请求即controller层的操作,这三个执行顺序为Filter>Interceptor>AOP, ...

  3. Spring AOP 和 AspectJ

    现如今有许多个可用的 AOP 库,使用这些库需要能够回答以下问题: 是否与现有的或新的应用程序兼容? 在哪里可以使用 AOP ? 如何迅速与应用程序集成? 性能开销是多少? 在本文中,我们将回答这些问 ...

  4. 比较分析 Spring AOP 和 AspectJ 之间的差别

    面向方面的编程(AOP) 是一种编程范式,旨在通过允许横切关注点的分离,提高模块化.AOP提供方面来将跨越对象关注点模块化.虽然现在可以获得许多AOP框架,但在这里我们要区分的只有两个流行的框架:Sp ...

  5. Spring aop与AspectJ的区别?

    根据我看spring官方文档的理解(不出意外是最正确的答案): ①选择spring的AOP还是AspectJ? spring确实有自己的AOP.功能已经基本够用了,除非你的要在接口上动态代理或者方法拦 ...

  6. spring aop与aspectj

    AOP:面向切面编程 简介 AOP解决的问题:将核心业务代码与外围业务(日志记录.权限校验.异常处理.事务控制)代码分离出来,提高模块化,降低代码耦合度,使职责更单一. AOP应用场景: 日志记录.权 ...

  7. 曹工说Spring Boot源码(22)-- 你说我Spring Aop依赖AspectJ,我依赖它什么了

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  8. Spring错误——Spring AOP——org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException

    背景:学习切面,测试前置通知功能,xml配置如下 <?xml version="1.0" encoding="UTF-8"?> <beans ...

  9. spring---aop(10)---Spring AOP中AspectJ

    写在前面 在之前的文章中有写到,Spring在配置中,会存在大量的切面配置.然而在很多情况下,SpringAOP 所提供的切面类真的不是很够用,比如想拦截制定的注解方法,我们就必须扩展DefalutP ...

随机推荐

  1. Qt写websocketpp服务端

    1.下载websocketpp,地址为https://github.com/zaphoyd/websocketpp,版本为0.7. 2.下载boost,地址为https://www.boost.org ...

  2. 微信公众号_订阅号_微信JS-SDK网页开发

    微信JS-SDK( 分享接口很常用 ) 是微信公众平台 面向网页开发者提供的基于微信内的网页开发工具包 借助微信高效使用相机.语音.选题.位置等手机系统的能力,同时可以直接使用微信分享.扫一扫.支付等 ...

  3. 16进制转化8进制---map

    #include "stdio.h" #include "string.h" #include "string" #include &quo ...

  4. Web应用程序架构的比较

    架构 技术优势 技术挑战 团队优势 团队挑战 单体 低延时 开发简单 没有重复的模型/验证 伸缩 由于代码库过大引起的复杂度 特性内沟通的开销低 失败的恐惧 特性间沟通的开销大 前端+后端 能够单独扩 ...

  5. css display:flex 属性

    一:display:flex 布局 display:flex 是一种布局方式.它即可以应用于容器中,也可以应用于行内元素.是W3C提出的一种新的方案,可以简便.完整.响应式地实现各种页面布局.目前,它 ...

  6. [SDOI2009]SuperGCD

    题目链接 这题.高精度.恶心.难受. 那么高精度的gcd怎么做呢? 若a=b gcd(a,b)=a ①a偶b偶 gcd(a,b)=2*gcd(a/2,b/2) ②a偶b奇 gcd(a,b)=gcd(a ...

  7. PHP 利用CURL(HTTP)实现服务器上传文件至另一服务器

    // 上传端 /** * 向目标地址推送xls文件 * @Date 2019/4/29 */ public function putXls() { // 目标接口 $url = "http: ...

  8. 你应当如何学习C++以及编程(细节是必要的,但不是重要的,把时间用在集中精力去解决问题,而不是学习新技术,那样练不成高手。在实践中提高才是最重要的。最最重要的内功还是长期学习所磨练出来的自学能力)good

    最近在学习Qt但由于没有C++的基础,感觉学的很吃力.看到pongba的这篇文章感觉不错就弄过来了, 原文地址:http://blog.csdn.net/qter_wd007/article/deta ...

  9. Vue学习记录第一天

    今天开始了Vue的学习,下面我就记录一下学习了什么. 1.什么是Vue? vue是一套基于javaScript的渐进式框架,是MVVM框架.View ——ViewModel——Model  其中Vie ...

  10. Eclipse集成Hadoop插件

    一.Eclipse集成Hadoop插件 1.在这之前我们需要配置真机上的hadoop环境变量 注:在解压tar包的时候普通解压会出现缺文件的现象,所以在这里我们需要用管理员的方式启动我们的解压软件(我 ...