Spring挖掘:(AOP篇)

学习AOP时,我们首先来了解一下何为AOP

一. 概念

AOP(面向切面编程,Aspect Oriented Programming)是一种编程技术,旨在通过预编译方式或运行期动态代理实现程序功能的统一管理和增强。AOP的主要目标是在不改变原有业务逻辑代码的基础上,添加或修改非核心业务逻辑,如日志记录、性能监控、安全检查等。这种方式有助于减少代码重复,提高代码的模块化程度,降低系统组件间的耦合度,进而提升软件的可维护性和可扩展性。

AOP的核心概念包括:

切面(Aspect):切面是关注点的模块化,它横切多个对象。例如,事务管理就是一个典型的切面。

连接点(Join Point):程序执行过程中的某个点,如方法调用或异常抛出。AOP框架会在这个点上应用切面。

通知(Advice):切面在特定的连接点上执行的动作。根据调用时机不同,通知分为前置通知、后置通知、环绕通知等。

切入点(Pointcut):定义了通知应该应用于哪些连接点的规则。它是切面的一个组成部分。

用图来表示

注意的是:所有方法都是一个连接点,而我们需要增强的就是一个切入点

二. 底层

AOP其实是基于代理模式来实现的.而在Java当中,分为静态代理和动态代理两种模式.

简单描述一下静态代理,着重表示一下动态代理.

2.1 静态代理

静态代理: 你可以理解为就是硬编码, 例如现在一个计算器类,分别有加减乘除功能.而此时你想增强这些方法,例如在这些方法上面添加一些日志,那静态代理的实现就是创建一个新的类,聚合一下这个计算器类,也实现计算器类实现的接口,也就是加减乘除. 去实现具体的加减乘除时还是调用原本计算器类的方法,只是在调用这个方法前后可以书写你要增加的逻辑.

2.2 动态代理

在动态代理当中我们分为两种代理方式.

2.2.1 JDK动态代理

JDK的代理是基于接口实现的.如果一个类没有实现接口,是不可以使用JDK的动态代理的.

2.2.1.1 演示

我通过一个火车站售票的一个场景来演示一下动态代理是怎么实现的.

创建一个售票的接口,里面有两个方法,一个售票,一个打印

创建一个火车站类,实现这个接口

在JDK中,我们可以调用Proxy.newProxyInstance()方法来获取一个代理对象.

  • 第一个参数为加载当前需要代理的类的类加载器,
  • 第二个参数为需要代理的类的实现的接口(这也就证明是基于接口来实现的)
  • 第三个参数需要一个实现InvocationHandler接口的类,可以用匿名内部类来实现,这一块也就是用来增加逻辑的一块.

我们创建一个代理工厂的类来实现这段逻辑

测试类

测试结果

2.2.2 CGLIB动态代理

CGLIB是可以基于接口也可以基于类实现的.

2.2.2.1 演示

还是买票这个例子,只不过我们换种实现.

而使用CGLIB代理时,我们需要去实现MethodInterceptor接口,创建代理对象时,需要使用CGLIB提供的Enhance类来实现.

这里使用了三个方法.

setInterfaces与setSuperclass通过方法名我们知道,是用来设置代理类的接口与父类.侧面也证实了CGLIB是可以基于接口和类实现的.

而setCallback的作用是设置回调对象,回调对象在CGLIB生成的代理对象中用于处理方法调用。具体来说:

  • 当通过代理对象调用方法时,CGLIB会拦截该方法调用,并将控制权交给回调对象。
  • 回调对象可以对方法调用进行增强处理,如添加日志、事务管理、权限检查等。
  • 在这个例子中,回调对象被设置为当前对象(this),意味着当前对象需要实现CGLIB的回调接口(如MethodInterceptor),以便在方法调用时执行特定的逻辑.

所以这就是为什么需要实现MethodInterceptor方法.

测试类

测试结果

我们尝试将Transtaion实现的接口不实现,看能否代理成功

测试类

测试结果

我们清晰看到代理没有任何问题,也是通过代理对象调用的.

二. AOP实战演练

我们简单书写一个计算机的工具类

现在我们来书写一个AOP切面类.

介绍一下这里使用到的几个重要注解的作用

  • @Aspect(切面类): 声明此类为一个AOP切面类,需要扫描方法上Before等注解
  • @PointCut(切入点): 切入点表达式,选取对应的连接点来作为切入点
    • execution: 切入点表达式,以 返回值 + [全限类名] + 方法名(参数类型),* 指代任意类型
  • @Before(前置通知): 方法调用前执行
  • @After(后置通知): 方法调用后执行
  • @AfterThrowing(异常后通知): 方法执行时发生异常执行
  • @AfterReturning(方法返回后通知): 方法能正确返回值执行.

他们的调度过程可以用一张图来表示

我们执行测试类来查看测试结果

这里有两个细节

  • 第一个表明了AOP拦截的执行顺序为前置,返回(无异常时),后置
  • 第二个表明,我们查看到实际上执行对应方法的是代理对象,而更注意的是SpringBoot的底层使用的是CGLIB代理.但实际上我们还看到一个执行对象就是我们具体的实现CaculatorImpl,这两个是不一样的,在使用add方法的入口时,使用的是AOP代理对象,而实际去执行方法时,还是调用我们实现的CaculatorImpl去实现的.

这就是我们基于Spring AOP来简单实现了一下如何应用.

那么复杂一点的情形,现在有两个切面类同时应用到了同一个方法,那么又会是怎么样的情形呢?

我们再书写一个权限的切面类,来查看会有什么现象产生

同样启动我们的测试实例,来查看效果

我们观察到执行顺序如下面这一张图来表示

所以我们了解到有AOP嵌套时的,执行顺序会变成这样的流程,会把另一个AOP的过程当成整体作为执行流程.

还有一个情形,就是当我们使用环绕通知时,我们是可以利用环绕通知模拟这四个情形,我们修改我们原来日志的代码

利用环绕通知来模拟四种情形,启动一下测试

至此AOP基本功能我们都测试完毕,还有一种情形我们一直没有探究,当我们执行时出现异常时,AOP的执行流程是什么样子的呢?

测试结果为 前置 -> 执行 -> 异常 -> 后置

那我们再开启一下我们之前的权限AOP,我们捕获了异常,此时会发生什么现象呢?(由于异常日志太多,我这里捕获异常就不打印啦)

在权限这里,我们发现他并没有走异常处理的增强,执行流程为下方图示这样

所以,我们通常建议环绕通知时,捕获异常后,继续往上抛出异常,让其他的AOP对象感知到异常的存在,执行对应的异常处理.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/910208.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Rust-宏编程

巴山楚水凄凉地,二十三年弃置身。 怀旧空吟闻笛赋,到乡翻似烂柯人。 沉舟侧畔千帆过,病树前头万木春。 今日听君歌一曲,暂凭杯酒长精神。 ——《酬乐天扬州初逢席上见赠》唐刘禹锡 【哲理】翻覆的船只旁仍有千千万万的帆船经过&a…

计算机网络——网络层导论

转发是局部功能——数据平面 路由是全局的功能——控制平面 网卡 网卡,也称为网络适配器,是计算机硬件中的一种设备,主要负责在计算机和网络之间进行数据传输。 一、主要功能 1、数据传输: 发送数据时,网卡将计算机…

推荐一款非常好用的视频编辑软件:Movavi Video Editor Plus

MovaviVideoEditorPlus(视频编辑软件)可以制作令人惊叹的视频,即使您没有任何视频编辑方面的经验! 该款视频编辑程序没有复杂的设置,只需进行直观的拖放控制。在您的电脑上免费使用MovaviVideoEditor亲身体验它的简单易用性与强大功能! 基本简介 您是否…

基于MPPT最大功率跟踪的光伏发电蓄电池控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于MPPT最大功率跟踪的光伏发电蓄电池控制系统simulink建模与仿真。本系统包括PV模块,电池模块,电池控制器模块,MPPT模块,PWM模…

势不可挡 创新引领 | 生信科技SOLIDWORKS 2025新品发布会·苏州站精彩回顾

2024年11月01日,由生信科技举办的SOLIDWORKS 2025新产品发布会在江苏苏州圆满落幕。现场邀请到制造业的专家学者们一同感受SOLIDWORKS 2025最新功能,探索制造业数字化转型之路。 在苏州站活动开场,达索系统专业客户事业部华东区渠道经理马腾飞…

[Element] el-table修改滚动条上部分的背景色

[Element] el-table修改滚动条上部分的背景色 ::v-deep .el-table__cell .gutter {background: red;}

esp32cam+Arduino IDE在编译时提示找不到 esp_camera.h 的解决办法

多半是因为你的ESP32库升级了,不再是 1.02版本,或者根本就没有 ESp32 库。如果被升级了,还原为1.02版本就可以了。如果没有,按照下述方法添加: 首先,在"文件"->"首选项"->"…

基于SpringBoot的“会员制医疗预约服务管理信息系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“会员制医疗预约服务管理信息系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统首页界面图 医院信息界面图…

qt QHeaderView详解

1、概述 QHeaderView 是 Qt 框架中的一个类,它通常作为 QTableView、QTreeView 等视图类的一部分,用于显示和管理列的标题(对于水平头)或行的标题(对于垂直头)。QHeaderView 提供了对这些标题的排序、筛选…

AJAX 全面教程:从基础到高级

AJAX 全面教程:从基础到高级 目录 什么是 AJAXAJAX 的工作原理AJAX 的主要对象AJAX 的基本用法AJAX 与 JSONAJAX 的高级用法AJAX 的错误处理AJAX 的性能优化AJAX 的安全性AJAX 的应用场景总结与展望 什么是 AJAX AJAX(Asynchronous JavaScript and XML…

空天地遥感数据识别与计算——建议收藏!

原文链接:空天地遥感数据识别与计算https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247625527&idx3&sn53b4d7a7203ab47c26b53c691627ce27&chksmfa8daad0cdfa23c637fa13ec8ebe7344ff48c6c6c08be022dadf601371d8676238290bb9b1fe&token136…

【算法】【优选算法】滑动窗口(下)

目录 一、904.⽔果成篮1.1 滑动窗口1.2 暴力枚举 二、438.找到字符串中所有字⺟异位词2.1 滑动窗口2.2 暴力枚举 三、30.串联所有单词的⼦串3.1 滑动窗口3.2 暴力枚举 四、76.最⼩覆盖⼦串4.1 滑动窗口4.2 暴力枚举 一、904.⽔果成篮 题目链接:904.⽔果成篮 题目描…

Node.js——fs模块-路径补充说明

1、相对路径: ./座右铭.txt 当前目录下的座右铭.txt座右铭.txt 等效于上面的写法../座右铭.txt 当前目录的上一级目录中的座右铭.txt 2、绝对路径 D:/Program File Windows系统下的绝对路径/usr/bin Linux系统…

征程 6E DISPLAY 功能介绍

1.功能概述 本文实现单路、多路 MIPI CSI TX 输出、IDU 回写、IDU oneshot 模式、绑定输出 VPS 数据等功能,此处主要介绍各 sample 的实现与使用方法。 2.软件架构说明 本文中绑定 VPS 输出功能基于 libvio API 实现,调用 libvio 提供的 API&#xff…

JS事件防抖函数封装通用代码片段

JavaScript 函数防抖是一种技术,用于解决在特定时间段内连续触发事件时产生的问题。当一个事件被触发时,通过设定一个特定的延迟时间,在这个延迟时间内如果事件再次触发,则重新计时。只有当事件没有在延迟时间内再次触发时&#x…

xshell连接不上linux的原因

1、首先我们确定好linux的配置,右键选择设置,将网络适配器设置成NAT模式 2、点击linux编辑,选择虚拟网络 打开以后选中自己要配置的服务 3、进入以后选中自己的服务,确保是NAT模式,然后配置好子网ip(尽量ip…

题目练习之二叉树那些事儿

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ 知道了二叉树的结…

K8S篇(基本介绍)

目录 一、什么是Kubernetes? 二、Kubernetes管理员认证(CKA) 1. 简介 2. 考试难易程度 3. 考试时长 4. 多少分及格 5. 考试费用 三、Kubernetes整体架构 Master Nodes 四、Kubernetes架构及和核心组件 五、Kubernetes各个组件及功…

webrtc前端播放器完整案例

https://download.csdn.net/download/jinhuding/89961792

深圳新世联:氢能中的气体传感器应用

氢能作为一种替代能源,被认为是破解能源危机,构建清洁低碳、安全高效现代能源体系的新密码。氢能的开发与利用正在引发一场深刻的能源革命。在2024年《政府工作报告》中,“加快前沿新兴氢能产业发展”这一重要任务被明确提出。据预测&#xf…