Spring AOP (一)

news2024/9/25 3:19:48

本篇主要介绍Spring AOP的基础概念和入门使用

一、AOP的基本概念

AOP是一种面向切面编程的思想,它与IOC并称为Spring 的两大核心思想。什么是面向切面编程呢,具体来说就是对一类事情进行集中统一处理。这听起来像不像前面篇章中所介绍的统一功能处理?事实上,统一功能处理确实是对AOP的一种实现,但AOP在Spring中的实现并不仅仅体现于此,因为统一功能处理都是只能针对某种特定的场景,例如拦截器只能在接收请求时进行集中处理,而在Spring 对AOP的实现中,可以自定义要对哪类事情集中处理。

接下来我们来介绍一下AOP的一些相关概念

  • 切面:整个集中处理的过程就叫切面
  • 切点:提供一组规则,来判断要对哪些方法进行集中处理
  • 连接点:满足切点规则的某一个方法,也就是要集中处理的所有方法中的具体的一个方法
  • 通知:集中处理的具体方法逻辑

在Spring中,通知有多种类型:

  • 环绕通知:包含了在连接点执行前与执行后所要执行的逻辑(在Spring中通过@Around注解标注)
  • 前置通知:在连接点执行前所要执行的逻辑(在Spring中通过@Before注解标注)
  • 后置通知:在连接点执行完后所要执行的逻辑(在Spring中通过@After注解标注)
  • 返回后通知:在连接点返回数据后执行,如果连接点在返回数据前发生异常则不会执行(在Spring中通过@AfterReturning注解标注)
  • 异常后通知:在连接点执行过程中发生异常后执行(在Spring中通过@AfterThrowing注解标注)

二、AOP的使用

单一切面

前面我们说过Spring AOP中可以自定义要对哪些类集中处理,因此,接下来我们通过对所有方法集中处理来具体体会一下Spring AOP的使用,集中处理的具体内容为记录所有方法的 执行时间。

首先我们得引入Spring aop的相关依赖:
 

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

然后我们得创建一个切面,具体为创建一个类,在类上加上一个@Aspect注解,用来标注当前类是一个切面类:

然后我们编写切面里包含的切点,通知等内容,由于我们要统计方法执行时间,因此我们可以使用环绕通知来统计也可以使用前置通知和后置通知搭配来统计,这里我们两种都写一下。具体代码如下(目标方法为我们的连接点):

这个切面代码还不能直接使用,因为我们还没有定义切点,我们可以直接将切点定义到通知注解里,具体如下:

关于这里对切点的具体的定义格式我们在下面在进行介绍,这里只要知道这个切点的规则是controller包下的所有方法就行 ,还有我们每次使用通知都得加上这样一个切点。

加好切点以后,一个切面类就定义好了,下面我们定义一个方法来测试一下:

借助浏览器访问这个接口后,控制台的打印如下:

可以发现通知和目标方法是按下图的顺序执行的

 下面我们来了解一下异常后通知:

首先我们先在切面里定义一个异常通知:

然后在controller里新增一个test02方法,在这个方法里定义一个算术异常

然后我们通过浏览器测试一下这个接口,

控制台的输出如下:


 通过日志可以发现,当目标方法发生异常时,环绕通知,和返回后通知都没有在执行了,返回后通知没有执行很好理解,因为目标方法还没有返回数据前发生异常了,所以目标方法就不会有返回值,也就不能触发返回后通知。为什么环绕通知也不执行了呢,我们来看一下执行目标方法的proceed方法的实现:

可以发现它把异常上抛给环绕通知了,所以环绕通知直接结束了。如果我们不想让环绕通知因异常而结束,可以在目标方法里直接将异常catch住,这样异常就不会上抛给环绕通知了,环绕通知也就不会发生影响了,代码如下

我们也可以在环绕通知里对异常进行catch:

 打印的日志如下:

可以发现环绕通知都完整执行了。

多个切面 

 这里我们介绍的是只有一个切面的情况,下面我们再来看一下多个切面的情况,这里我们在定义切面类CostTimeAdvice1,具体内容如下:

我们在来访问一下test01

日志如下:

通过日志可以发现,当存在多个切面时是按一种类似一种同心圆的顺序执行的,具体如下:


 通过图片可以发现目标方法外面被包裹了两层切面。

这两层切面的包裹顺序是可以自定义的。具体为通过给切面设置优先级,设置优先级就得使用@Order注解,这个注解可以给类设置优先级,当进行使用时优先使用优先级高的类。在@Order注解里需要设置一个数值,这个数值越小,类的优先级越高,反之。数越大,类的优先级越低。接下来我们来通过设置优先级来调整一下这两个切面的顺序:

然后我们来测试一下:

通过日志可以发现,切面的顺序果然被调整了。

通过上述对Spring AOP的使用我们可以总结出使用AOP有如下优点:

  • 在不侵入代码(也就是不修改原始代码)的前提下,对代码的功能进行增强(就是对目标方法进行拓展,例如我们的目标方法原本是不能记录执行时长的,通过切面就有记录时长的功能了)
  • 减少了重复的代码
  • 便于维护
  • 提高开发效率

 三、切点表达式

@pointcut

前面我们在定义切点时都得写一大长串,这样未免太麻烦,因此我们可以通过使用@pointcut注解来简化对切点的定义。

具体如下:

先写一个@pointcut注解,然后在注解里编写切点规则,然后再注解下定义一个方法,具体如下:

这样一个切点就设置好了。

如果我们要使用这个切点,直接在通知注解里引入这个方法即可:

excution表达式

excution表达式是一种常用的切点表达式,他用来表示一组规则,其语法如下:

excution(<访问限定符><返回类型> <包名.类名.方法名(方法参数)><异常>)  

通常情况下,访问限定符和异常可以被省略。前面我们使用的excution就进行了省略。excution支持使用正则表达式,正则表达式的语法如下:

  • ' * ' 表示任意一个字符串或者一个字符 ,因此可以用来表示包名,数据类型,类名,方法名等
  • ' . '表示任意一个字符,这个字符可以是一个普通字符,也可以是一个' * '
  • ’ ..'表示任意数量个 ‘ . '
@annotation表达式

使用excution表达式来定义切点其实存在一定缺陷,因为它是一组规则,只有符合规则的方法才能处理,但有时候我们所需要集中处理的方法并没有一个统一的规则,这时我们就需要使用@Annotation表达式了。使用这个注解的流程如下:

  1. 创建自定义注解
  2. 在需要集中处理的方法上加上该自定义注解
  3. 在通知上使用@annotation表达式

接下来我们来具体演示一下,首先我们创建一个@MyAspect注解(在new时选择@anonotation):

(大括号里还可以为注解设置一些属性,这里暂且不想去,就不设置了) 

然后我们在我们的test01方法上加一下这个注解

然后我们将切面所有通知注解都改为使用@annotation表达式:

然后我们通过浏览器来测试一下:

通过日志可以发现使用@annotation也成功设置好切点了。

Spring实现Aop的方式

最后我们在来看一个面试题:

Spring实现AOP的方式有哪些?

  • 基于@Aspect注解和excution表达式
  • 基于@Aspect和@annotation表达式
  • 基于Spring AOP的相关api(配置xml)
  • 基于代理

其中前面两种方式在上面的文章中已经演示过了,至于后面这两种方式这里就不介绍了,因为这两种方式已经逐渐过时,很少有人使用了。 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue2 移动端(H5)项目封装弹窗组件

前言 因vant-ui的dialog组件没有自定义footer插槽 效果 参数配置 1、代码示例&#xff1a; <t-dialog :visible.sync"show" :title"title" submit"submit"></t-dialog>2、配置参数&#xff08;t-dialog Attributes&#xff09; 参…

JAVA基础之垃圾收集器

一 JVM垃圾收集 分代收集思想 当前虚拟机的垃圾收集一般采用分代收集算法&#xff0c;这种算法本身没有创新性&#xff0c;只是根据对象存活周期的不同将内存分为几块。一般将java堆内存分为新生代和老年代&#xff0c;这样我们就可以根据不同年龄到的特点选择不同的垃圾收集…

自动驾驶控制算法

本文内容来源是B站——忠厚老实的老王&#xff0c;侵删。 三个坐标系和一些有关的物理量 使用 frenet坐标系可以实现将车辆纵向控制和横向控制解耦&#xff0c;将其分开控制。使用右手系来进行学习。 一些有关物理量的基本概念&#xff1a; 运动学方程 建立微分方程 主要是弄…

Agent 智能体食用指南

Agent 智能体食用指南 三年前都在 ALL in AI&#xff0c;一年前都在 ALL in LLM&#xff0c;现在都在 ALL in AgentAutoGEN分析MetaGPT 分析RAG 分析MOE 多专家分析 三年前都在 ALL in AI&#xff0c;一年前都在 ALL in LLM&#xff0c;现在都在 ALL in Agent 科技圈焦点&…

智己汽车数据驱动中心PMO高级经理张晶女士受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 智己汽车科技有限公司数据驱动中心PMO高级经理张晶女士受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“规模化敏捷落地实践”。大会将于5月25-26日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; 2…

Spring Bean依赖注入-Spring入门(二)

1、SpringBean概述 在Spring中&#xff0c;一切Java对象都被视为Bean&#xff0c;用于实现某个具体功能。 Bean的依赖关系注入的过程&#xff0c;也称为Bean的装配过程。 Bean的装配方式有3种&#xff1a; XML配置文件注解Java类 Spring中常用的两种装配方式分别是基于XML的…

秋招之路 面经

这里参考一位很厉害的前辈所分享的他的嵌入式软件工程师秋招之路&#xff0c;自己详细的读了一下他的经历以及他的分享的秋招面试和项目经验的总结。 我的嵌入式软件工程师秋招之路&#xff08;文末送福利&#xff09;_嵌入式软件工程师 刷leetcode-CSDN博客 如何在面试中介绍…

UA时间控件,选择时分的控件

方式一&#xff1a; <sit-property sit-widget"sit-time-picker"sit-value"vm.StartTime"sit-format"HH:mm"sit-validation"{required: true}"sit-read-only"false">开始时间:</sit-property> 方式二&#xff…

go-cqhttp 机器人使用教程

API | go-cqhttp 帮助中心 参考 | go-cqhttp 帮助中心 机器人下载 发送消息 http://127.0.0.1:5700/send_msg?message_typeprivate&user_id911412667&message你好呀 检查端口是否打开 netstat -ano | findstr :5701 发送的请求 软件的dopost的解析 Overridepro…

【MySQL】Linux环境下MySQL基本操作

目录 一、登录进入MySQL 二、MySQL数据库的查看、创建、删除、重命名、拷贝操作 三、数据库下表的创建、删除、查看、修改&#xff08;增加、删除、更新字段/列&#xff0c;修改字段/列名&#xff09; 四、表中数据的插入、删除、查找、更新 一、登录进入MySQL mysql -u u…

【小浩算法cpp题解】判断环形链表

目录 前言我的思路思路一 &#xff08;哈希表记录链表的访问&#xff09;&#xff1a;思路二 &#xff08;双指针&#xff0c;快指针在前&#xff0c;慢指针在后&#xff09;&#xff1a; 我的代码运行结果 前言 前几天我写的代码&#xff0c;都是把所有的内容写在main函数里&…

国产生骨肉冻干品控好不好?热榜TOP5生骨肉冻干分享

对于新手养猫人来说&#xff0c;进口生骨肉冻干的高价常常让人疑惑&#xff0c;为何它能在养猫达人中赢得如此高的声誉&#xff1f;与国产生骨肉冻干相比&#xff0c;进口产品的价格高出数倍&#xff0c;那么这高昂的价格是否代表了其独特的价值&#xff0c;还是只是一个消费陷…

Ghost Buster Pro for Mac:强大的系统优化工具

Ghost Buster Pro for Mac是一款功能强大的系统优化工具&#xff0c;专为Mac用户设计&#xff0c;旨在提供全方位的系统清理、优化和维护服务。 Ghost Buster Pro for Mac v3.2.5激活版下载 这款软件拥有出色的垃圾清理能力&#xff0c;能够深度扫描并清除Mac上的无效目录、文件…

小白看完这篇文章也能踏进网安大门,成为网络安全工程师

前言 在当前的互联网环境下&#xff0c;不少人感受到了职场的寒冬与996工作制的压力。然而&#xff0c;无论环境如何变化&#xff0c;掌握实用的技术始终是保障职业稳定和发展的关键。特别是在网络安全这一领域&#xff0c;技术人才需求量大且持续增长。今天&#xff0c;我们将…

出海企业必备:Zoho Desk打造高效海外工单管理体系!

出海工单系统和常见的工单系统相比有什么不同呢&#xff1f;工单系统主要事帮助售前或者售后人员记录、处理、跟踪客户需求&#xff0c;不仅有利于企业内部管理的规范化&#xff0c;还能够有效提高客户服务质量。 工单系统可以帮助出海企业搭建统一的订单管理、售后服务、甚至…

微电子领域常见概念(六)化学键合

微电子领域常见概念&#xff08;六&#xff09;化学键合 化学键合是化学中一个非常基础且重要的概念&#xff0c;它描述了原子之间通过电子的相互作用形成的连接。可以进行以下分类&#xff1a; 1. 离子键合&#xff08;Ionic Bonding&#xff09; • 定义&#xff1a;离子键合…

(CVPR,2023)SAN:用于开放词汇语义分割的边缘适配网络

文章目录 相关论文相关资料摘要引言方法对视觉 token 的特征融合使用注意力偏差进行掩码识别分割图像生成 实验 相关论文 &#xff08;CVPR&#xff0c;2024&#xff09;SED&#xff1a;一个用于开放词汇语义分割的简单编解码器 &#xff08;CVPR&#xff0c;2024&#xff09;…

javaWeb项目-财务管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Springboot框架 …

计算机工作者学习平台

给大家分享了几个非常有用的学习平台&#xff0c;可以作为参考&#xff0c;具体为&#xff1a; 1.中国大学MOOC 中国大学MOOC_优质在线课程学习平台 2.牛客 牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推&#xff0c;求职就业一站解决_牛客网 3.CSDN https://www…

Learn ComputeShader 02 Multiple kernels

前面已经成功创建了第一个compute shader&#xff0c;并且使用它替换掉quad的材质的纹理&#xff0c;现在我们将要在计算着色器中创建多个kernel。 首先调整上次的计算着色器&#xff0c;让它显示为红色。 然后再次创建一个kernel&#xff0c;显示为黄色。 结果应该是这样的…