AOP与AspectJ的关系
AOP与AspectJ的关系
- AspectJ简介
- 两者关系
- 引用关系
- 织入(Weaving)
- 依赖
- 代理模式
- aspectj静态代理
- jdk动态代理
- cglib的动态代理
AspectJ简介
AspectJ是java编程语言的无缝的面向方面的扩展,一整套完整的切面增强解决方案,包含自己的语法,编译器,最终可以在java代码的字节码中植入切面代码。
AspectJ 是静态代理的增强,所谓的静态代理就是 AOP 框架会在编译阶段生成 AOP 代理类,因此也称为编译时增强。
AspectJ 是 Java 语言的一个 AOP 实现,其主要包括两个部分:
- 第一个部分定义了如何表达、定义 AOP 编程中的语法规范,通过这套语言规范,我们可以方便地用 AOP 来解决 Java 语言中存在的交叉关注点问题
- 另一个部分是工具部分,包括编译器、调试工具等。
AspectJ 是最早、功能比较强大的 AOP 实现之一,对整套 AOP 机制都有较好的实现,很多其他语言的 AOP 实现,也借鉴或采纳了 AspectJ 中很多设计。在 Java 领域,AspectJ 中的很多语法结构基本上已成为 AOP 领域的标准。
两者关系
AOP面向切面编程是一种编程思想,是对OOP面向对象编程的一种补充。对于AOP这种编程思想,很多框架都进行了实现。Spring就是其中之一,可以完成面向切面编程。而AspectJ也实现了AOP的功能,且其实现方式更为简捷,使用更为方便,而且还支持注解式开发。所以,Spring又将AspectJ对于AOP的实现也引入到了自己的框架中。
引用关系
我们可以看到Spring Aop中引入了aspectjweaver这个包,下面说明一下作用和原因。
织入(Weaving)
AspectJ 作为 AOP 编程的完全解决方案,提供了三种织入时机,分别为
- compile-time:编译期织入,在编译的时候一步到位,直接编译出包含织入代码的 .class 文件
- post-compile:编译后织入,增强已经编译出来的类,如我们要增强依赖的 jar 包中的某个类的某个方法
- load-time:在 JVM 进行类加载的时候进行织入
组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。
依赖
所以Spring AOP只需要依赖aspectjweaver包来负责织入就可以,不需要引入AspectJ的编译器。
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.13</version>
</dependency>
代理模式
aspectj静态代理
原理:在编译期织入代码,编译成class文件
优点:可以增强任何类,任何方法,包括(final,static修饰)
缺点:需要使用aspecj提供的Ajc编译器来编译Aj文件。
jdk动态代理
使用jdk的动态代理来增强接口实现类
原理:使用Proxy类的newProxyInstance方法运行期通过反射动态的生成代理对象
优点:不需要修改具体的业务代码,动态的增强方法,降低耦合性。
缺点:代理的对象必须有接口实现。
cglib的动态代理
可以对jdk的动态代理作为补充
原理:以创建目标类的子类来生成动态代理对象。
优点:不需要修改具体的业务代码,动态的增强方法,降低耦合性。
缺点:不能对final修饰的类,final修饰的方法或static的方法进行代理
AOP与AspectJ的关系相关推荐
- 框架源码专题:Spring的Aop实现原理,Spring AOP 与 AspectJ 的关系
文章目录 1. Spring AOP 与 AspectJ 的关系 2. JDK和Cglib动态代理的区别 3. Spring AOP应用案例 4. Spring AOP有几种配置方式? 5. Spri ...
- AOP各种表达式,aspectj的关系
Aop是什么 与OOP对比,面向切面,传统的OOP开发中的代码逻辑是自上而下的,而这些过程会产生一些横切性问题,这些横切性的问题和我们的主业务逻辑关系不大,这些横切性问题不会影响到主逻辑实现的,但是会 ...
- SpringAop与AspectJ的联系与区别____比较分析 Spring AOP 和 AspectJ 之间的差别
SpringAop与AspectJ的联系与区别 区别 AspectJ AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Ja ...
- AOP之@AspectJ技术原理详解
一AOP 1 主要功能 2 主要目标 3 适用对象 4 AOP与OOP的关系 二Android中使用AspectJ 1 Gradle 配置示 2 基本概念 21 切面Aspect 22 连接点Join ...
- 比较Spring AOP与AspectJ
本文翻译自博客Comparing Spring AOP and AspectJ 介绍 如今有多个可用的AOP库,这些组件需要回答一系列的问题: 是否与我现有的应用兼容? 我在哪实现AOP? 集成到我的 ...
- 比较分析 Spring AOP 和 AspectJ 之间的差别
面向方面的编程(AOP) 是一种编程范式,旨在通过允许横切关注点的分离,提高模块化.AOP提供方面来将跨越对象关注点模块化.虽然现在可以获得许多AOP框架,但在这里我们要区分的只有两个流行的框架:Sp ...
- 在 Spring Boot 中使用 Spring AOP 和 AspectJ 来测量方法的执行时间
原文链接:https://dzone.com/articles/logging-average-method-execution-times-via-aspectj 作者:Murat Derman 译 ...
- aopaspect区别_面试官:什么是AOP?Spring AOP和AspectJ的区别是什么?
AOP(Aspect Orient Programming),它是面向对象编程的一种补充,主要应用于处理一些具有横切性质的系统级服务,如日志收集.事务管理.安全检查.缓存.对象池管理等. AOP实现的 ...
- 比较Spring AOP和AspectJ
1. 介绍 当前有多个可用的AOP库,这些库必须能够回答许多问题: 它与我现有的或新的应用程序兼容吗? 在哪里可以实施AOP? 它与我的应用程序集成的速度有多快? 性能开销是多少? 在本文中,我们将着 ...
- AOP的XML架构、AOP的@AspectJ
AOP的XML架构 aop的xml架构例子:https://www.w3cschool.cn/wkspring/omps1mm6.html aop的@AspectJ例子:https://www.w3c ...
最新文章
- leetcode002 add_two_numbers
- 读“基于深度学习的图像识别技术研究综述”有感
- java b kb mb gb 转换_java 上传文件大小转换为 GB/MB/KB/B
- 数据结构哪本书比较好_东莞工厂电动伸缩门固定在哪一边比较好?
- python分布式爬虫及数据存储_二十一 Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫数据保存...
- client mac addr不能开机进不去系统_用asp.net core结合fastdfs打造分布式文件存储系统
- ASP.Net/C# - PayPal接口文档
- 每日一题/005/矩阵/数学归纳法/设A的顺序主子式均不为0.则有下三角矩阵B,使得BA是上三角矩阵,
- 矢量数据空间索引之R树索引
- 【乐理入门】——音符与五线谱(1)
- 快上车!薅腾讯羊毛!
- linux 改成utc时间_linux – 如何将时区设置为UTC-8
- Android签名工具 AndroidMultitool使用方法
- matlab零阶保持器的作用,5.8 记忆模块、零阶保持器、一阶保持器
- Bootstrap 折叠(Collapse)插件
- 鸡小德手机小常识 如何鉴定手机是否为行货
- Elasticsearch设置账号密码
- python找不到指定模块之几种可能的解决办法:
- 来自原CSDN排名第一博主:成功的背后!(给所有IT人)
- Map阶段环形缓冲区详细分析