[JAVAee]SpringBoot-AOP

news2024/12/24 21:29:43

目录

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.coloradmin.cn/o/1060273.html

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

相关文章

联想Lenovo 威6 15-ITL(82F2)原厂Win10系统

lenovo联想原装出厂系统 自带所有驱动、出厂主题壁纸LOGO、Office办公软件、联想电脑管家等预装程序 下载链接&#xff1a;https://pan.baidu.com/s/1darORHmIyAXkD7HvKRNHNw?pwddh6e 所需要工具&#xff1a;16G或以上的U盘 文件格式&#xff1a;ISO 文件大小&#xff1a;11.…

号卡推广管理系统源码/手机流量卡推广网站源码/PHP源码+带后台版本+分销系统

源码简介&#xff1a; 号卡推广管理系统源码/手机流量卡推广网站源码&#xff0c;基于PHP源码&#xff0c;而且它是带后台版本&#xff0c;分销系统。运用全新UI流量卡官网系统源码有后台带文章。 这个流量卡销售网站源码&#xff0c;PHP流量卡分销系统&#xff0c;它可以支持…

mysql技术文档--阿里巴巴java准则《Mysql数据库建表规约》--结合阿丹理解尝试解读--国庆开卷

阿丹&#xff1a; 国庆快乐呀大家&#xff01; 在项目开始前一个好的设计、一个健康的表关系&#xff0c;不仅会让开发变的有趣舒服&#xff0c;也会在后期的维护和升级迭代中让系统不断的成长。那么今天就认识和解读一下阿里的准则&#xff01;&#xff01; 建表规约 表达是…

【科学文献计量】关于使用metaknowledge读取文献后转化字典结构URLError报错问题的解决方式

关于使用metaknowledge读取文献后转化字典结构URLError报错问题的解决方式 1 报错提醒2 问题解决 1 报错提醒 读入数据后&#xff0c;转化为字典数据结构中&#xff0c;出现URLError报错 2 问题解决 &#xff08;1&#xff09; 网络波动 重新运行几次后&#xff0c;自动连…

大厂生产级Redis高并发分布式锁实战

文章目录 一、扣减库存不加锁二、加一把jvm锁试试看三、引入分布式锁四、try finally五、设置key的过期时间六、原子设置锁和过期时间七、给线程设置唯一id八、锁续命redisson九、redisson加锁释放锁的逻辑十、redisson源码分析 一、扣减库存不加锁 先看一段扣减库存的代码 Au…

vscode登录租的新服务器

1.connect to…… 选择 connect current window to host 2.configure SSH Host 选择本地配置文件 打开配置文件&#xff0c;把主机名端口号写进去 再返回vscode远程登录页面&#xff0c;左侧栏就会出现这个主机名了。

Hadoop启动后jps发现没有DateNode解决办法

多次使用 Hadoop namenode -format 格式化节点后DateNode丢失 找到hadoop配置文件core-site.xml查找tmp路径 进入该路径&#xff0c;使用rm -rf data删除data文件 再次使用Hadoop namenode -format 格式化后jps后出现DateNode节点

实现springboot的简单使用~

在之前学习SpringSpringMVCMybatis框架时&#xff0c;我们学习了多种配置spring程序的方式&#xff0c;例如&#xff1a;使用XML&#xff0c;注解&#xff0c;Java配置类&#xff0c;或者是将它们结合使用&#xff0c;但配置文件配置起来依然过于复杂&#xff0c;而我们接下来要…

VC++创建windows服务程序

目录 1.关于windows标准可执行程序和服务程序 2.服务相关整理 2.1 VC编写服务 2.2 服务注册 2.3 服务卸载 2.4 启动服务 2.5 关闭服务 2.6 sc命令 2.7 查看服务 3.标准程序 3.1 后台方式运行标准程序 3.2 查找进程 3.3 终止进程 以前经常在Linux下编写服务器程序…

【操作系统】进程同步与进程互斥

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 进程同步与进程互斥 一、什么是进程同步二、…

RabbitMQ-主题模式

接上文 RabbitMQ-发布订阅模式和路由模式 1 主题模式 #通配符 代表0个或多个。*通配符 代表 1个或多个 进行测试&#xff0c;修改配置文件 Configuration public class RabbitConfiguration {Bean("topicExchange") //这里使用预置的Topic类型交换机public Exchan…

深度学习(3)---PyTorch中的张量

文章目录 一、张量简介与创建1.1 简介1.2 张量的创建 二、张量的操作2.1 张量的拼接与切分2.2 张量索引 三、张量的数学运算 一、张量简介与创建 1.1 简介 1. 张量是一个多维数组&#xff0c;它是标量、向量、矩阵的高维拓展。 2. 在张量的定义中&#xff0c;方括号用于表示张…

智慧公厕是什么?

随着城市化进程的不断加速&#xff0c;公共厕所作为城市基础设施之一&#xff0c;也在不断进行着前所未有的变革。智慧公厕作为新一代的公共厕所形式&#xff0c;旨在提供更便捷、舒适、卫生的使用体验&#xff0c;不仅仅是个人使用需求的满足&#xff0c;更是城市文明程度和城…

山西电力市场日前价格预测【2023-10-05】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-05&#xff09;山西电力市场全天平均日前电价为363.87元/MWh。其中&#xff0c;最高日前电价为649.89元/MWh&#xff0c;预计出现在18: 45。最低日前电价为291.58元/MWh&#xff0c;预计…

实验三十四、串联型稳压电路参数的选择

一、题目 电路如图1所示。已知输入电压为 50 Hz 50\,\textrm{Hz} 50Hz 的正弦交流电&#xff0c;来源于电源变压器副边&#xff1b;输出电压调节范围为 5 ∼ 20 V 5\sim20\,\textrm V 5∼20V&#xff0c;满载为 0.5 A 0.5\,\textrm A 0.5A&#xff1b; C 3 C_3 C3​ 为消振…

【itext7】使用itext7将多个PDF文件、图片合并成一个PDF文件,图片旋转、图片缩放

这篇文章&#xff0c;主要介绍使用itext7将多个PDF文件、图片合并成一个PDF文件&#xff0c;图片旋转、图片缩放。 目录 一、itext7合并PDF 1.1、引入依赖 1.2、合并PDF介绍 1.3、采用字节数组方式读取PDF文件 1.4、合并多个PDF文件 1.5、合并图片到PDF文件 1.6、旋转图…

LVGL_基础控件label

LVGL_基础控件label 1、创建一个基础对象 /* 创建一个基础对象 label */ lv_obj_t * label lv_label_create(lv_scr_act()); // 创建一个label部件(对象),他的父对象是活动屏幕对象2、设置显示内容 char * text "www.100ask.net"; // 要显示的文字 /* 展示文…

K8S网络原理

文章目录 一、Kubernetes网络模型设计原则IP-per-Pod模型 二、Kubernetes的网络实现容器到容器的通信Pod之间的通信同一个Node内Pod之间的通信不同Node上Pod之间的通信 CNI网络模型CNM模型CNI模型在Kubernetes中使用网络插件 开源的网络组件FlannelFlannel实现图Flannel特点 Op…

视频批量剪辑工具,自定义视频速率,批量剪辑工具助力创意无限”

在视频制作的世界里&#xff0c;每一个细节都至关重要。今天&#xff0c;让我们来探索一项强大且创新的功能——自定义视频速率。利用它&#xff0c;你可以轻松地调整视频播放速度&#xff0c;赋予你的作品独特的个性和风格。 首先第一步&#xff0c;我们要打开好简单批量智剪…

智慧公厕有什么?

智慧公厕作为一种新形态的公共厕所&#xff0c;把智慧化的技术融入到公共厕所的日常使用与管理当中&#xff0c;赋予公共厕所更良好的信息化、数字化、科技化、联网化。 那么&#xff0c;智慧公厕有什么&#xff1f;本文从设施、技术、服务三方面进行快速了解。 首先&#xf…