[JAVAee]SpringBoot-AOP

目录

Spring AOP

​编辑AOP适用场景

AOP的组成

连接点(Join Point)

切点(Pointcut)

通知(Advice)

Spring AOP的实现

添加依赖

定义切面与切点 

切点表达式的说明

 定义相关的通知


Spring AOP

AOP(Aspect Oriented Programming)是面向切面编程,是一种设计思想.对某一类的事情集中处理

就像是在页面需要在用户为登录状态这个前提下才能进行后序的操作,一个项目肯定不止有一个页面,那么对于每一个不同页面的方法我们都要去加入判断用户登录状态的程序,在后期维护和修改的时候花费的成本会比较大.

对于这些需要去完成同一件事的不同的方法/类,我们就可以把他们集中起来进行配置处理.

AOP适用场景

适用于对于功能统一且被运用比较多的就可以考虑用AOP进行统一的处理.

1.页面登录状态的验证

2.统一的日志记录

3.统一的方法执行时间的计算

...

AOP就像给某一个方法/类在特定的位置新增添了一些功能.

但这些功能是我们程序员本来就想让他们实现的,但是每一个方法都实现花费的成本就比较多,所以集中起来进行统一的配置. 

AOP的组成

AOP中有四个关键词:切面(Aspect),切点(Pointcut),连接点(Join Point)以及通知(Advice)

下面对四个关键词进行展开,并简单说明AOP的流程.

连接点(Join Point)

连接点是应用执行过程中能够插入切面的一个点.这个点可以是方法中的开头,抛出异常时或方法结束的之前或之后.

切点(Pointcut)

切点指的是通知要织入的具体位置.

(切点与连接点的关系图) 

通知(Advice)

切面的工作被称为了通知.通知定义了切面的工作是什么,以及要工作的时间节点.

通知有着五种类型:

  • 前置通知(Before):在目标方法被调用之前调用通知功能
  • 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么
  • 返回通知(After-returning):在目标方法成功执行之后调用通知
  • 异常通知(After-throwing):在目标方法抛出异常后调用通知
  • 环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和之后执行自定义的行为

切面(Aspect) 

切面是通知与切点的集合.其包含了工作的内容,执行的地点与执行的时间.

Spring AOP的实现

添加依赖

在Maven仓库中搜索AOP,选择

Maven Repository: org.springframework.boot » spring-boot-starter-aop (mvnrepository.com)

此处我选择的是2.7.x的版本 

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

定义切面与切点 

 在与启动类的同一个目录下,创建AOP包并创建一个对应的类,我们会将这个类定义为"切面"

@Aspect //切面的定义
@Component//还是要把此类注入到spring boot当中
public class UserAOP {//切点的定义//AspectJ表达式,来规定切点的范围@Pointcut("execution(* com.example.demo.Controller.UserController.* (..))")public void pointcut(){}@Pointcut()public void abcd(){} //@Pointcut注解下的方法都是无具体实现的空方法,作为@Pointcut标签的"载体"@Before("pointcut()")//通知public void doBefore(){System.out.println("前置通知");}
}

 @Pointcut修饰的方法都不需要具体实现,只是作为标识的存在.因为切点可以很多个,就可以用被注解的方法名来区分并调用.

切点表达式的说明

AspectJ表达式支持三种通配符

  • * :匹配任意字符,只匹配⼀个元素(包,类,或⽅法,⽅法参数)
  • .. :匹配任意字符,可以匹配多个元素 ,在表示类时,必须和 * 联合使⽤。
  • + :表示按照类型匹配指定类的所有类,必须跟在类名后⾯,如 com.cad.Car+ ,表示继承该类的所有⼦类包括本身

切点表达式由切点函数组成,其中 execution() 是最常⽤的切点函数,⽤来匹配⽅法,语法:

execution(<修饰符><返回类型><包.类.⽅法(参数)><异常>)

一般修饰符与异常两个参数可以省略.

修饰符:

  1. public,匹配修饰符为public的
  2. * ,任意

返回类型:

  1. void,匹配返回类型为void的
  2. *,任意

包(包的路径):

  1. com.example.demo,在此包下的
  2. com.example.demo.*.controller,在demo子包下的任意的controller包下(例如在,前面省略demo.aop.controller)
  3. com.example.demo..(两个"."),在demo下面的任意子包即自己

类:

  1. UserAOP,指定的固定类
  2. *AOP,指定以AOP结尾的类
  3. User*,指定以User开头的类
  4. *,任意

方法名:

  1. addUser,指定方法
  2. *User,以User结尾的方法
  3. add*,以add为开头的方法
  4. *,任意

参数:

  1. (),指定无参的方法
  2. (int),指定只有一个参数,且参数为int的方法
  3. (int,String),指定有两个参数,且第一个为int,第二个为String的方法
  4. (..),参数任意

示例:

"execution(* com.example.demo.Controller.UserController.* (..))":匹配对应Controller包中UserController类下的所有方法都可以作为切点.

 定义相关的通知

通知的定义是被拦截的方法具体要执行的业务.像是前面所说的登录验证,在切点范围中的方法将要执行之前会被拦截下来,先进行登录验证.这个登录验证就是具体要执行的业务.

    @Before("pointcut()")public void doBefore(){System.out.println("前置通知");}@After("pointcut()")public void doAfter(){System.out.println("后置通知");}@AfterReturning("pointcut()")public void doAfterReturn(){System.out.println("方法返回前发送的通知");}@AfterThrowing("pointcut()")public void doAfterThrow(){System.out.println("方法抛出异常前发送的通知");}//以上方法都是Around下的注解,Around更像是自定义模式,指定通知在哪里执行.@Around("pointcut()")public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {Object result = null;System.out.println("哇哈哈哈");result = proceedingJoinPoint.proceed();//调用被拦截的方法System.out.println("wahahaha");return result;}

关于环绕通知的几个注意点:

  1. 使用Object作为返回值,相比于前面几个类型的通知.环绕通知显然更灵活一些,其可以选择调用被拦截的方法,也可以选择不调用而自身根据某些条件直接返回.但如果进行了调用,对于拦截的方法由于是动态的,在执行之前我们并不知道方法的返回值是什么只能使用Object类接收.
  2. 要含有ProceedingJoinPoint参数,在这个类的对象下可以调用proceed方法来启动被拦截下的方法.
  3. 其他通知只是在原来方法的基础上进行增添功能,而环绕通知则可以直接决定方法是否被进行调用.

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

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

相关文章

termius mac版无需登录注册直接永久使用

1. 下载地址&#xff1a;termius下载 2. 解压安装 3. 当出现 “termius”已损坏,无法打开 则输入以下命令即可&#xff1a;sudo xattr -r -d com.apple.quarantine /Applications/Termius.app 最后去 系统设置-> 隐私与安全性-> 仍要打开 4. 删除app-update.yml文件&…

竞赛选题 深度学习 python opencv 动物识别与检测

文章目录 0 前言1 深度学习实现动物识别与检测2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存…

Android Camera FW 里的requestId和frameId

安卓相机frameworks里面经常出现requestId和frameId&#xff0c;最近简单看了一下代码&#xff0c;发现相关流程还是很复杂的&#xff0c;总结来看requestId 就是上层&#xff08;java&#xff09;发送的repeating(capture)请求的id&#xff0c;是从0开始递增的。 这是CameraD…

jira 浏览器插件在问题列表页快速编辑问题标题

jira-issueTable-quicker 这是一个可以帮助我们在问题表格页快速编辑问题的浏览器插件 github 地址 功能介绍 jira 不可否认是一个可以帮助有效提高工作效率的工具&#xff0c;但是我们在使用 jira 时使用问题表格可以让我们看到跟多的内容而不用关注细节&#xff0c;但是目…

简单两步实现离线部署ChatGPT,ChatGPT平替版,无需GPU离线搭建ChatGPT

文末附主程序安装包和大模型参数文件~ 演示效果如下图所示&#xff1a; 一、使用方法 软件主要分为两个部分&#xff1a;GPT4ALL软件主体&#xff08;主程序&#xff09;模型参数&#xff08;离线模型&#xff09;&#xff0c;如果使用API Key的话则不需要下载模型参数。 可以…

Linux和Hadoop的学习

目录 1. Linux的常用快捷键2. Hadoop集群部署问题汇总 1. Linux的常用快捷键 复制&#xff1a;CtrlshiftC 粘贴&#xff1a;CtrlshiftV TAB&#xff1a;补全命令 编写输入&#xff1a;i 退出编写&#xff1a;esc 保存并退出&#xff1a;shift&#xff1a; 2. Hadoop集群部署问…

mariadb 错误日志中报错:Incorrect definition of table mysql.column_stats:

数据库错误日志出现此错误原因是因为系统表中字段类型或者数据结构有变动导致&#xff0c;一般是因为升级数据库版本后未同步升级系统表结构。 解决方法&#xff1a; 1.如果错误日志过大&#xff0c;直接删除。 2.执行 mysql_upgrade -u[用户名] -p[密码];&#xff0c;这一步…

Redis-数据过期策略

数据过期策略 惰性删除策略优点&#xff1a;对cpu比较友好&#xff0c;在用到该key的时候才去进行判断&#xff0c;对于很多用不到key不用浪费时间去检查是否过期缺点&#xff1a;对内存不友好&#xff0c;如果一个key过期了&#xff0c;但是我们又一直没有用到该key&#xff0…

一张图搞定英文星期、月份、季节总也搞不定的星期,月份,季节,一张图搞定,还有必用的常见搭配,再也不担心用错介词了~

一张图搞定英文星期、月份、季节 总也搞不定的星期&#xff0c;月份&#xff0c;季节&#xff0c;一张图搞定&#xff0c;还有必用的常见搭配&#xff0c;再也不担心用错介词了~

使用vite+npm封装组件库并发布到npm仓库

组件库背景&#xff1a;使用elementplusvue封装了一个通过表单组件。通过JSX对el-form下的el-input和el-button等表单进行统一封装&#xff0c;最后达到&#xff0c;通过数据即可一键生成页面表单的功能。 1.使用vite创建vue项目 npm create vitelatest elementplus-auto-form…

Anaconda的下载与安装

1、下载 Anaconda 这里不管是集成显卡还是独立显卡&#xff0c;第一步先安装Anaconda。 网址&#xff1a;https://mirrors.bfsu.edu.cn/anaconda/archive/ &#xff0c;这里给出的是镜像源&#xff0c;也可以去官网下载&#xff08;下载哪个版本都行&#xff09;。 2、下载完成…

ST表(RMQ问题)

ST表能够O(1)地解决区间[l,r]之间最值问题 1.建表&#xff0c;首先明白ST[i][j]&#xff0c;表示的是区间[i, i(1<<j)-1]的最值&#xff0c;区间大小为2^j。首先初始化ST[i][0]a[i]。 void init&#xff08;&#xff09;{for(int i1; i<n; i){ST[i][0]a[i];} } 因为…

【Python_PyQtGraph 学习笔记(八)】基于PyQtGraph将X轴坐标设置为系统时间

【Python_PyQtGraph 学习笔记(八)】基于PyQtGraph将X轴坐标设置为系统时间 前言正文1、获取plotItem的bottom轴对象2、设置刻度值,即获取时间3、刻度值与显示数值绑定4、设置bottom轴的刻度数值显示前言 基于PySide2、PyQtGraph和PySide2动态绘图,将X轴坐标设置为系统事件…

几道web题目

总结几道国庆写的web题目 [ACTF2020 新生赛]Include1 点进去发现就一个flag.php,源代码和抓包都没拿到好东西 结合题目猜是文件包含&#xff0c;构建payload ?filephp://filter/readconvert.base64-encode/resourceflag.php 得到base64编码过的flag&#xff0c;解码即可 此题…

南美巴西市场最全分析开发攻略,收藏一篇就够了

巴西位于南美洲东部&#xff0c;是南美洲资源最丰富&#xff0c;经济活力和经济实力最强的国家。巴西作为拉丁美洲的出口大国&#xff0c;一直是一个比较有潜力的市场&#xff0c;亦是我国外贸公司和独立外贸人集群的地方。中国长期是巴西主要的合作伙伴&#xff0c;2022年占巴…

React组件

一、React组件 函数组件 // 函数组件 // 组件的名称必须首字母大写 // 函数组件必须有返回值 如果不需要渲染任何内容&#xff0c;则返回 null function HelloFn () {return <div>这是我的第一个函数组件!</div> }// 定义类组件 function App () {return (<di…

解决方案:AI赋能工业生产3.0,从工业“制造”到“智造”

视频监控技术是一种既成熟又广泛应用于工业制造领域的先进技术。它可以通过安装各种摄像头和传感器来监测整个生产流程&#xff0c;包括原材料的采购、加工、装配和物流等环节&#xff0c;从而实现对生产过程的实时监控和管理&#xff0c;以及对异常事件的及时预警和响应。 在…

安全防御—密码学

1. 什么是APT&#xff1f; APT&#xff08;Advanced Persistent Threat&#xff09;是指高级持续性威胁&#xff0c;本质是针对性攻击。 利用先进的攻击手段对特定目标进行长期持续性网络攻击的攻击形式&#xff0c;APT攻击的原理相对于其他攻击形式更为高级和先进&#xff0c;…

matlab数学建模方法与实践 笔记汇总

matlab数学建模方法与实践 笔记汇总 写在最前面笔记1&#xff1a;快速入门1.导入数据2.数据探索3.多项式拟合4.发布功能5.数据类型6、全部代码 笔记2&#xff1a;数据的准备1.数据的读取与写入excel、txt读图读视频 2.数据预处理缺失值噪声过滤数据归约数据变换 3.数据统计4.数…

除静电离子风蛇的工作原理及应用

静电离子风蛇是一种通过产生大量负离子来中和空气中的静电荷的设备。它们通常用于防止静电对电子设备、印刷机、加工机等工业设备造成损害。 静电离子风蛇的工作原理是通过电离器将空气中的氧气分子转化为氧离子&#xff0c;然后将这些氧离子释放到空气中。这些氧离子会与空气…