【二:Spring-AOP】

目录

一 、AOP
1、什么是AOP

(1)面向切面编程(Aspect Oriented Programming,AOP),利用AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

(2)通俗描述:不通过修改源代码方式,在主干功能里面添加新功能

2、AOP的类型
  • 静态代理:代码间的耦合性降低,但是如果代理的类过多,代码量将会大大增加。(直接定义一个代理类,使用set方法或构造方法将目标类传入代理类,然后再对方法进行扩展,其中代理类和目标类都实现同一个接口)------参考博客:静态代理
  • 动态代理:一个动态代理类代理的是一个接口,一般对应一类业务,可以代理多个类,只要实现了同一个接口即可。
3、AOP(底层原理)

AOP 底层使用动态代理

(1)第一种有接口情况,使用JDK 动态代理
  • 被代理类必须实现接口,基于InvocationHandler、Proxy生成代理类。
  • JDK 动态代理主要涉及到java.lang.reflect 包中的:Proxy 类和InvocationHandler接口。JDK动态代理通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编制在一起。 Proxy 利用InvocationHandler 动态创建一个符合某一接口的实例,生成目标类的代理对象。
(2)第二种没有接口情况,使用CGLIB 动态代理
  • 代理类继承被代理类,被代理类不需要实现接口。
  • CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,比使用Java反射效率要高。唯一需要注意的是,CGLib不能对声明为final的方法进行代理,因为CGLib原理是动态生成被代理类的子类。

参考博客:JDK和cglib实现

(3)spring两种代理方式的优缺点

1)若目标对象实现了若干接口,spring使用JDK的java.lang.reflect.Proxy类代理。

  • 优点:因为有接口,所以使系统更加松耦合
  • 缺点:为每一个目标类创建接口

2)若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。

  • 优点:因为代理类与目标类是继承关系,所以不需要有接口的存在。CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,比使用Java反射效率要高,相比于JDK的实现方式性能更好。
  • 缺点:因为没有使用接口,所以系统的耦合性没有使用JDK的动态代理好。

参考博客:字节码增强和Spring AOP原理
注意:

Spring中默认的策略是如果目标类是接口,则使用JDK 动态代理技术,否则使用Cglib 来生成代理。

4、AOP(术语)
(1)AOP中的名词

连接点(JointPoint) :目标对象中所有可以增强的方法叫做连接点。
切入点(PointCut) :目标对象中将要被增强的的方法。
通知(Advice) :实际需要添加的逻辑部分。
关注点 :是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。
横切关注点 :部分关注点横切程序代码中的数个模块,即在多个模块中都有出现,它们即被称作横切关注点。如日志 , 安全 , 缓存 , 事务等等 ,这些功能往往横跨系统中的每个业务模块。
切面(Aspect) : 对横切性关注点的抽象,即为切面。一个切面就是一个类。类里面的方法就是一个通知。
目标(Target) :被通知对象。
代理(Proxy) :将通知应用于目标对象后创建的对象。
Weavy(织入): 将通知应用到连接点的过程。

横切关注点,即哪些方法需要被拦截,执行什么样的逻辑。对关注点的抽象,即是切面。一个切面就是一个类,类里面的方法就是一个通知。有了切面和通知,就需要定义这些通知的切入点,换句话说,就是哪些方法需要被拦截,而这些被拦截的方法就是连接点,所谓的连接点就是被织入切面的方法。通知的执行就是织入的过程,而被织入这些通知的对象,就是目标对象。

(2) 五种通知(Advice)类型

Spring的AOP框架里的5种Advice(通知),在不改变原代码的情况下去添加新功能。

(1)前置通知 [Before advice]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常。

(2)后置通知 [After advice]:在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容。

(3)环绕通知 [Around advice]:环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大的通知类型,能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继续处理join point(连接点)(调用ProceedingJoinPoint的proceed方法)还是中断执行。

(4)正常返回通知 [After returning advice]:在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行。

(5)异常返回通知[After throwing advice]:在连接点抛出异常后执行。

Spring AOP 详解_springaop_yyhgo_的博客-CSDN博客

相关推荐
带刺的坐椅16 小时前
snack4-jsonpath v4.0.36 发布(支持 IETF RFC 9535 标准)
java·json·jsonpath·snack4
巫山老妖16 小时前
OpenClaw 技术教程大全:从安装到多 Agent 协作,全在这里
java·前端
William_cl16 小时前
ASP.NET Identity 核心实战:注册 / 登录 / 角色管理(避坑指南 + 生活类比)
后端·asp.net·生活
Fox爱分享16 小时前
阿里二面:如何保证 Redis 和 MySQL 的数据一致性?还在背“延时双删”的Sleep玄学?教你高性能 + 高可靠的方案
redis·后端·面试
xiaogg367816 小时前
springboot3+vue3+elementPlus+minio8.2 大文件分片上传
java·spring boot·spring
文心快码 Baidu Comate16 小时前
Comate 4.0的自我进化:后端“0帧起手”写前端、自己修自己!
前端·人工智能·后端·ai编程·文心快码·ai编程助手
青梅主码16 小时前
全网爆火的「养龙虾」怎么玩?OpenClaw 从 0 到 1 安装、使用以及卸载保姆级教程,新手零门槛上手(附教程下载)
后端
phltxy16 小时前
前缀和算法:从一维到二维,解锁高效区间求和
java·开发语言·算法
码上淘金17 小时前
Prometheus 瘦身指南:小白也能看懂的指标过滤与标签优化
java·算法·prometheus
一轮弯弯的明月17 小时前
竞赛刷题-建造最大岛屿-Java版
java·算法·深度优先·图搜索算法·学习心得