Spring AOP的实现方式

AOP基本概念

Spring框架的两大核心:IoC和AOP

AOP:Aspect Oriented Programming(面向切面编程)

           AOP是一种思想,是对某一类事情的集中处理

面向切面编程:切面就是指某一类特定的问题,所以AOP可以理解为面向特定方法编程

举例:拦截器是AOP的一种应用

“特定问题”:登录校验

针对特定问题统一处理:登录校验拦截器

Spring对AOP进行了实现,并且提供了一些API,就是Spring AOP

AOP的作用:

拦截器作用的维度是URL(⼀次请求和响应), @ControllerAdvice 应用 场景主要是全局异常处理
(配合自定义异常效果更佳), 数据绑定, 数据预处理。
AOP作用的维度更加细致(可以根据包、类、方法名、参数等进行拦截), 能够实现更加复杂的业务逻辑。

AOP开发步骤

举例:往之前的图书管理系统中创建一个切面aspect,打印每个接口的耗时。

引入AOP依赖

在pom.xml文件中添加配置

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

编写AOP程序

打印每个接口的耗时

@Component//交给Spring管理
@Slf4j//打印日志
@Aspect//表明改类为切面
public class TimeAspect {// @Around定义哪些是目标方法@Around("execution(*  com.example.SpringBookaliyun.controller.*.*(..))")public Object timeCost(ProceedingJoinPoint joinPoint) throws Throwable {//ProceedingJoinPoint表示作用的目标方法long start=System.currentTimeMillis();//执行目标方法Object result=joinPoint.proceed();long end=System.currentTimeMillis();log.info(joinPoint+"消耗时间:"+(end-start)+"ms");return result;}
}

通过上面的程序, 我们也可以感受到AOP面向切面编程的⼀些优势:

代码无侵入: 不修改原始的业务方法, 就可以对原始的业务方法进行功能的增强或者是功能的改变

减少了重复代码

提高开发效率

维护方便

AOP详解

1.切点:切入点 ,一组规则,通过表达式来描述

@Around("execution(*  com.example.SpringBookaliyun.controller.*.*(..))")

2.连接点:目标方法就是连接点;切点描述的方法

图书管理系统中controller下的所有方法(add、delete.....)

3.通知:具体的逻辑,要做的处理

4.切面:切点+通知

通知(advice)

Spring中AOP的通知类型有以下几种:

@Around: 环绕通知, 此注解标注的通知方法在目标方法前, 后都被执行

@Before: 前置通知, 此注解标注的通知方法目标方法前被执行 

@After: 后置通知, 此注解标注的通知方法目标方法后被执行, 无论是否有异常都会执行

@AfterReturning: 返回后通知, 此注解标注的通知方法目标方法后被执行, 有异常不会执行 

@AfterThrowing: 异常后通知, 此注解标注的通知方法发生异常后执行  

简单做一个测试:

测试结果:

先执行around,再执行before;先执行after,再执行around

当添加一个异常的接口,执行异常接口的时候,观察控制台的顺序:

切点

@PointCut
当有多个切面的时候,切面的执行顺序按照名称进行排序。但观察比较麻烦,下面介绍切面优先级。

切面优先级(@Order)

当我们在⼀个项目中, 定义了多个切面类时, 并且这些切面类的多个切入点都匹配到了同⼀个目标方法. 当目标方法运行的时候,运行顺序不方便管理。

Spring 给我们提供了一个新的注解, 来控制这些切面通知的执行顺序:@Order

使用@Order时,数字越小,优先级越高

切点表达式

切点表达式常见有两种表达⽅式

1. execution(RR):根据方法的签名来匹配

2. @annotation(RR) :根据注解匹配

execution表达式

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

访问修饰符和异常可以省略

//切点表达式⽰例 //TestController 下的 public修饰, 返回类型为String ⽅法名为t1, ⽆参⽅法 execution(public String com.example.demo.controller.TestController.t1())
//省略访问修饰符 execution(String com.example.demo.controller.TestController.t1()) 
//匹配所有返回类型 execution(* com.example.demo.controller.TestController.t1())
//匹配TestController 下的所有⽆参⽅法 execution(* com.example.demo.controller.TestController.*()) 
//匹配TestController 下的所有⽅法execution(* com.example.demo.controller.TestController.*(..)) 
//匹配controller包下所有的类的所有⽅法 execution(* com.example.demo.controller.*.*(..)) 
//匹配所有包下⾯的TestController execution(* com..TestController.*(..))
//匹配com.example.demo包下, ⼦孙包下的所有类的所有⽅法execution(* com.example.demo..*(..))

@annotation注解匹配

execution表达式更适用有规则的, 如果我们要匹配多个无规则的方法时, 例如:TestController中的t1() 和UserController中的u1()这两个方法.

这个时候使用execution这种切点表达式来描述比较麻烦。

此时使用@annotation 来描述这一类的切点

实现步骤:

1. 编写自定义注解

2. 使用@annotation 表达式来描述切点

3. 在连接点的方法上添加自定义注解

1. 编写自定义注解

2. 使用@annotation 表达式来描述切点

3. 在连接点的方法上添加自定义注解

此时只有执行h1和t2时,控制台才会出现对切点的描述

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

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

相关文章

167基于matlab的根据《液体动静压轴承》编写的有回油槽径向静压轴承的程序

基于matlab的根据《液体动静压轴承》编写的有回油槽径向静压轴承的程序&#xff0c;可显示承载能力、压强、刚度及温升等图谱.程序已调通&#xff0c;可直接运行。 167 显示承载能力、压强、刚度及温升 (xiaohongshu.com)https://www.xiaohongshu.com/explore/65d212b200000000…

【监控】spring actuator源码速读

目录 1.前言 2.先搂一眼EndPoint 3.EndPoint如何被注入 4.EndPoint如何被暴露 4.1.如何通过http暴露 4.2.如何通过jmx暴露 5.EndPoint是怎么实现监控能力的 6.知道这些的意义是什么 1.前言 版本&#xff1a;spring-boot-starter-actuator 2.6.3 阅读源码一定要带着疑…

Linux第47步_安装支持linux的第三方库和mkimage工具

安装支持linux的第三方库和mkimage工具&#xff0c;做好移植前的准备工作。 编译linux内核之前&#xff0c;需要先在 ubuntu上安装“lzop库”和“libssl-dev库”&#xff0c;否则内核编译会失败。 mkimage工具会在zImage镜像文件的前面添加0x40个字节的头部信息,就可以得到uI…

VQ35 评论替换和去除(char_length()和replace函数的使用)

代码 select id ,replace(comment,&#xff0c;,) as comment from comment_detail where char_length(comment)>3知识点 要注意替换的是中文逗号 由于题目说的是汉字长度大于3&#xff0c;所以这里就要使用char_length()而不是length() char_length()&#xff1a;单位为字…

IT行业高含金量证书全解析:开启职业生涯新篇章

在快速发展的IT行业&#xff0c;持续学习和专业认证是提升个人竞争力的重要途径。全球范围内存在着众多的IT认证&#xff0c;它们不仅能够验证你的技术能力&#xff0c;还能在求职和职业晋升中起到关键作用。 本篇博客将深入探讨IT行业中部分高含金量的证书&#xff0c;包括中…

详解Sora,为什么是AGI的又一个里程碑时刻?

文&#xff5c;郝 鑫 编&#xff5c;王一粟、刘雨琦 2024年伊始&#xff0c;OpenAI再向世界扔了一枚AI炸弹——视频生成模型Sora。 一如一年前的ChatGPT&#xff0c;Sora被认为是AGI&#xff08;通用人工智能&#xff09;的又一个里程碑时刻。 “Sora意味着AGI实现将从1…

浅谈js事件机制

事件是什么&#xff1f;事件模型&#xff1f; 原始事件模型&#xff08;DOM0级&#xff09; HTML代码中指定属性值&#xff1a;在js代码中指定属性值&#xff1a;优点&#xff1a;缺点&#xff1a; IE 事件模型DOM2事件模型 对事件循环的理解 宏任务&#xff08;Macrotasks&…

【机构vip教程】Android SDK手机测试环境搭建

Android SDK 的安装和环境变量的配置 前置条件&#xff1a;需已安装 jdk1.8及 以上版本 1、下载Android SDK&#xff0c;解压后即可&#xff08;全英文路径&#xff09;&#xff1b;下载地址&#xff1a;http://tools.android-studio.org/index.php/sdk 2、新建一个环境变量&…

【教程】Kotlin语言学习笔记(一)——认识Kotlin(持续更新)

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【Kotlin语言学习】系列文章 第一章 《认识Kotlin》 文章目录 【Kotlin语言学习】系列文章一、Kotlin介绍二、学习路径 一、…

在职阿里6年,一个28岁女软件测试工程师的心声

简单的先说一下&#xff0c;坐标杭州&#xff0c;16届本科毕业&#xff0c;算上年前在阿里巴巴的面试&#xff0c;一共有面试了有6家公司&#xff08;因为不想请假&#xff0c;因此只是每个晚上去其他公司面试&#xff0c;所以面试的公司比较少&#xff09; 其中成功的有4家&am…

阿里云香港轻量应用服务器怎么样,建站速度快吗?

阿里云香港服务器中国香港数据中心网络线路类型BGP多线精品&#xff0c;中国电信CN2高速网络高质量、大规格BGP带宽&#xff0c;运营商精品公网直连中国内地&#xff0c;时延更低&#xff0c;优化海外回中国内地流量的公网线路&#xff0c;可以提高国际业务访问质量。阿里云服务…

跟着pink老师前端入门教程(JavaScript)-day03

四、常量 概念&#xff1a;使用 const 声明的变量称为“常量”。 使用场景&#xff1a;当某个变量永远不会改变的时候&#xff0c;就可以使用 const 来声明&#xff0c;而不是let。 命名规范&#xff1a;和变量一致 常量使用&#xff1a; 注意&#xff1a;常量不允许重新…

今日Arxiv最热大模型论文:大语言模型真的理解上下文了吗?新研究揭示惊人发现

探索大型语言模型的上下文理解能力 在自然语言处理&#xff08; Natural Language Processing,NLP&#xff09;领域&#xff0c;理解上下文是把握人类语言的关键。近年来&#xff0c;大语言模型&#xff08;LLMs&#xff09;在展示对语言的理解方面取得了令人瞩目的成就。然而…

【论文解读】Latency-Aware Collaborative Perception

Latency-Aware Collaborative Perception 摘要引言方法SystemSyncNet 实验 摘要 协作感知最近显示出提高单智能体感知感知能力的巨大潜力。现有的协同感知方法通常考虑理想的通信环境。然而&#xff0c;在实践中&#xff0c;通信系统不可避免地存在延迟问题&#xff0c;导致安…

Java_方法(重载方法签名等详解)

在之前我们学习C语言时&#xff0c;当我们想要重复使用某段代码的功能时&#xff0c;我们会将这段代码定义为一个函数&#xff0c;而在java中我们把这段重复使用的代码叫做方法。 方法的定义 类体的内容分为变量的声明和方法的定义&#xff0c;方法的定义包括两部分&#xff1…

基于协同过滤的时尚穿搭推荐系统

项目&#xff1a;基于协同过滤的时尚穿搭推荐系统 摘 要 基于协同过滤的时尚穿搭推荐系统是一种能自动从网络上收集信息的工具&#xff0c;可根据用户的需求定向采集特定数据信息的工具&#xff0c;本项目通过研究服饰流行的分析和预测的分析和预测信息可视化时尚穿搭推荐系统…

多线程---线程同步,线程通信

线程同步 1.概述 线程同步是多线程编程中的一个重要概念&#xff0c;它指的是在多线程环境中&#xff0c;通过一定的机制保证多个线程按照某种特定的方式正确、有序地执行。这主要是为了避免并发问题&#xff0c;如死锁、竞态条件、资源争用等&#xff0c;确保数据的一致性和完…

分布式文件系统 SpringBoot+FastDFS+Vue.js【一】

分布式文件系统 SpringBootFastDFSVue.js【一】 一、分布式文件系统1.1.文件系统1.2.什么是分布式文件系统1.3.分布式文件系统的出现1.3.主流的分布式文件系统1.4.分布式文件服务提供商1.4.1.阿里OSS1.4.2.七牛云存储1.4.3.百度云存储 二、fastDFS2.1.fastDSF介绍2.2.为什么要使…

【STM32】软件SPI读写W25Q64芯片

目录 W25Q64模块 W25Q64芯片简介 硬件电路 W25Q64框图 Flash操作注意事项 状态寄存器 ​编辑 指令集 INSTRUCTIONS​编辑 ​编辑 SPI读写W25Q64代码 硬件接线图 MySPI.c MySPI.h W25Q64 W25Q64.c W25Q64.h main.c 测试 SPI通信&#xff08;W25Q64芯片简介&am…

【C++学习手札】多态:掌握面向对象编程的动态绑定与继承机制(深入)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;世界上的另一个我 1:02━━━━━━️&#x1f49f;──────── 3:58 &#x1f504; ◀️ ⏸ ▶️ ☰ &am…