AOP(Aspect Orient Programming),它是面向对象编程的一种补充,主要应用于处理一些具有横切性质的系统级服务,如日志收集、事务管理、安全检查、缓存、对象池管理等。

AOP实现的关键就在于AOP框架自动创建的AOP代理,AOP代理则可分为静态代理和动态代理两大类,其中静态代理是指使用AOP框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强;而动态代理则在运行时借助于JDK动态代理、CGLIB等在内存中“临时”生成AOP动态代理类,因此也被称为运行时增强。

面向切面的编程(AOP) 是一种编程范式,旨在通过允许横切关注点的分离,提高模块化。AOP提供切面来将跨越对象关注点模块化。

AOP要实现的是在我们写的代码的基础上进行一定的包装,如在方法执行前、或执行后、或是在执行中出现异常后这些地方进行拦截处理或叫做增强处理

Aop的概念

Pointcut:是一个(组)基于正则表达式的表达式,有点绕,就是说他本身是一个表达式,但是他是基于正则语法的。通常一个pointcut,会选取程序中的某些我们感兴趣的执行点,或者说是程序执行点的集合。

JoinPoint:通过pointcut选取出来的集合中的具体的一个执行点,我们就叫JoinPoint.

Advice:在选取出来的JoinPoint上要执行的操作、逻辑。关于5种类型,我不多说,不懂的同学自己补基础。

Aspect:就是我们关注点的模块化。这个关注点可能会横切多个对象和模块,事务管理是横切关注点的很好的例子。它是一个抽象的概念,从软件的角度来说是指在应用程序不同模块中的某一个领域或方面。又pointcut 和advice组成。

Weaving:把切面应用到目标对象来创建新的 advised 对象的过程。

AspectJ是什么?能做什么?

AspectJ是一个易用的功能强大的AOP框架

AspectJ全称是Eclipse AspectJ, 其官网地址是:http://www.eclipse.org/aspectj/ ,目前最新版本为:1.9.0

引用官网描述:

a seamless aspect-oriented extension to the Javatm programming language(一种基于Java平台的面向切面编程的语言)

Java platform compatible(兼容Java平台,可以无缝扩展)

easy to learn and use(易学易用)

可以单独使用,也可以整合到其它框架中。

单独使用AspectJ时需要使用专门的编译器ajc。

java的编译器是javac,AspectJ的编译器是ajc,aj是首字母缩写,c即compiler。

AspectJ和Spring AOP的区别?

相信作为Java开发者我们都很熟悉Spring这个框架,在spring框架中有一个主要的功能就是AOP,提到AOP就往往会想到AspectJ,下面我对AspectJ和Spring AOP作一个简单的比较:

Spring AOP

1、基于动态代理来实现,默认如果使用接口的,用JDK提供的动态代理实现,如果是方法则使用CGLIB实现

2、Spring AOP需要依赖IOC容器来管理,并且只能作用于Spring容器,使用纯Java代码实现

3、在性能上,由于Spring AOP是基于动态代理来实现的,在容器启动时需要生成代理实例,在方法调用上也会增加栈的深度,使得Spring AOP的性能不如AspectJ的那么好

AspectJ

AspectJ来自于Eclipse基金会

AspectJ属于静态织入,通过修改代码来实现,有如下几个织入的时机:

​ 1、编译期织入(Compile-time weaving): 如类 A 使用 AspectJ 添加了一个属性,类 B 引用了它,这个场景就需要编译期的时候就进行织入,否则没法编译类 B。

​ 2、编译后织入(Post-compile weaving): 也就是已经生成了 .class 文件,或已经打成 jar 包了,这种情况我们需要增强处理的话,就要用到编译后织入。

3、类加载后织入(Load-time weaving):

指的是在加载类的时候进行织入,要实现这个时期的织入,有几种常见的方法。1、自定义类加载器来干这个,这个应该是最容易想到的办法,在被织入类加载到

JVM 前去对它进行加载,这样就可以在加载的时候定义行为了。2、在 JVM 启动的时候指定 AspectJ 提供的 agent:-javaagent:xxx/xxx/aspectjweaver.jar。

AspectJ可以做Spring AOP干不了的事情,它是AOP编程的完全解决方案,Spring AOP则致力于解决企业级开发中最普遍的AOP(方法织入)。而不是成为像AspectJ一样的AOP方案

因为AspectJ在实际运行之前就完成了织入,所以说它生成的类是没有额外运行时开销的

对比总结

下表总结了 Spring AOP 和 AspectJ 之间的关键区别:

转载原路径:https://zhuanlan.zhihu.com/p/113256693

本次转载只为学习,如有侵犯请通知删除!!!

aopaspect区别_面试官:什么是AOP?Spring AOP和AspectJ的区别是什么?相关推荐

  1. mysql幻读和不可重复读的区别_面试官:MySQL的可重复读级别能解决幻读吗

    Java面试笔试面经.Java技术每天学习一点 Java面试 关注不迷路 作者:宁愿. 来源:https://juejin.im/post/5c9040e95188252d92095a9e 引言 之前 ...

  2. 操作系统的线程和进程的区别_面试官:你熟悉多线程嘛?线程跟进程有什么区别?...

    这篇文章跟大家聊聊线程,讲到线程,⼜不得不提进程了~ 进程我们估计是很了解的了,在windows下打开任务管理器,可以发现我们在操作系统上运⾏的程序都是进程. 什么是叫一个进程? 什么叫一个线程? 进 ...

  3. 不可重复读和幻读的区别_面试官:MySQL的可重复读级别能解决幻读吗

    Java面试笔试面经.Java技术每天学习一点 Java面试 关注不迷路 作者:宁愿. 来源:https://juejin.im/post/5c9040e95188252d92095a9e 引言 之前 ...

  4. 面试java你最擅长什么_面试官最喜欢问的10道Java面试题

    1.Java的HashMap是如何工作的? HashMap是一个针对数据结构的键值,每个键都会有相应的值,关键是识别这样的值. HashMap 基于 hashing 原理,我们通过 put ()和 g ...

  5. 百度面试官:来聊聊Spring吧

    文章目录 Spring入门和IOC介绍 1. Spring介绍 1.1侵入式概念 1.2 松耦合概念 1.3 切面编程 2. 引出Spring 2.1 IOC控制反转 3.Spring模块 4. Co ...

  6. firefox 接受post 不完整_面试官想听到的GET和POST两种基本请求方法的区别

    前言 HTTP定义了与服务器交互的不同方法,最常用的方法有四种Put,Delete.post,get,即增删改查. 1.Get,它用于获取信息,它只是获取.查询数据,也就是说它不会修改服务器上的数据, ...

  7. swf缓存文件在哪里_面试官:mybatis一级缓存二级缓存的区别都不知道,知道门在哪吧...

    面试官:虫虫你简历上写了了解mybatis缓存,那你能说说一级缓存和二级缓存的区别吗? 虫虫:我只知道这是用来缓存sql查询的数据 面试官:没了? 虫虫:没了 面试官:公司门知道在哪里吧 自己走还是我 ...

  8. 307 跳转会携带请求方法吗_面试官:GET和POST两种基本请求方法有什么区别

    点击上方蓝色"后端面试那些事儿",选择"设为星标" 学最好的别人,做最好的我们 来源:r6d.cn/j26B GET和POST是HTTP请求的两种基本方法,要说 ...

  9. 引用计数器法 可达性分析算法_面试官:你说你熟悉jvm?那你讲一下并发的可达性分析...

    持续输出原创文章,点击蓝字关注我吧 上面这张图是我还是北漂的时候,在鼓楼附近的胡同里面拍的. 那天刚刚下完雨,路过这个地方的时候,一瞬间就被这五颜六色的门板和自行车给吸引了,于是拍下了这张图片.看到这 ...

最新文章

  1. android8camera,[Android8.0/9.0/10]Camera:外接 USB 摄像头
  2. 垃圾回收算法简单介绍——JVM读书笔记lt;二gt;
  3. svgaps绘制时不能用中文命名吗_设计师需要了解的切图命名规范
  4. ant中的table和pagination表格分页结合使用 手写分页
  5. 从任意网页上摘取酷炫Jquery效果为自己使用的方法
  6. RefineMask:实例分割,使用细粒度信息增强性能
  7. 基于鸿蒙Hi3861和华为云平台的烟雾报警器
  8. 基于I2C总线的MPU6050学习笔记
  9. QThread使用方法
  10. Java字符串中最长回文子字符串
  11. 数据库索引失效的一些场景
  12. hex2text php,php如通过AES加密/解密实现bin2hex和hex2bin之间的切换
  13. 云桌面优缺点_云桌面的缺点分析
  14. 什么是OCR?如何使用OCR文字识别软件?
  15. roslyn生成html,通过Roslyn将字符串生成可以执行的C#代码
  16. android 视频转码需要权限,android 使用 ffmpeg 进行视频转码(一)
  17. 经纬度转GeoHash
  18. Python 云标签——玩点浪漫!
  19. Date时间里的GMT是什么意思
  20. Docker学习--修改阿里云镜像

热门文章

  1. python读取文件r_python 文件读写模式r,r+,w,w+,a,a+的区别(附代码示例)
  2. druiddatasource配置_Springboot属性注入 Java配置和Value配置
  3. 华为申请鸿蒙系统邮箱,华为鸿蒙系统
  4. Python基础入门:正则re.sub使用自定义替换方法
  5. Python with as 用法
  6. Python 列表复制
  7. python -使用del语句删除对象引用
  8. mysql+只读参数_mysql只读变量
  9. 20200207_Dontla_MBTI第二步解释性报告(ISTJ(内向+感觉+思考+判断))
  10. 程序的格式框架语法元素的名称(Python)