【Spring内容进阶 | 第三篇】AOP进阶内容

news2024/11/16 21:35:53

前言:

        在前面我们已经粗略的介绍了什么是AOP以及各种基础知识点,而本篇我们将聚焦于AOP的细节,详细的讲解一下AOP中的通知类型,通知顺序,切入点表达式以及连接点。通过对AOP的熟练掌握,我们可以快速编写出低耦合度的代码。

目录

前言:

通知类型:

通知以及切面顺序:

通知顺序从先到后分别为:

切面优先级从前到后分别为:

切入点表达式:

总结:


通知类型:

在前面我们使用的通知类型都是环绕通知

而在AOP中还有很多的通知类型:

  1. 前置通知(Before Advice):在目标方法执行之前执行的通知。它可以用于执行一些预处理操作,比如安全检查、参数验证等。

  2. 后置通知(After Advice):在目标方法执行之后(不考虑方法是否出现异常)执行的通知。它可以用于执行一些清理操作,比如释放资源、记录操作日志等。

  3. 返回通知(After Returning Advice):在目标方法成功执行并返回结果之后执行的通知。可以获取目标方法的返回值,并进行相应的处理。

  4. 异常通知(After Throwing Advice):在目标方法抛出异常时执行的通知。它可以用于捕获目标方法抛出的异常,并进行相应的处理或记录错误信息。

  5. 环绕通知(Around Advice):在目标方法执行之前和之后都可以执行的通知。环绕通知可以完全控制目标方法的执行过程,包括参数的传递、调用目标方法、异常的处理等。

这些通知类型可以根据实际需求选择使用,并结合切入点(Pointcut)定义来确定在哪些连接点上触发对应的通知。通过使用各种通知类型,可以实现对横切关注点的精确控制,并在目标对象的核心业务逻辑与横切逻辑之间实现解耦。

@Around环绕通知需要自己调用 ProceedingJoinPoint.proceed()来让原始方法执行,而其他的通知不需要考虑让目标方法执行

@Around环绕通知的返回值,必须指定为object类来接收原始方法的返回值

通知以及切面顺序:

如果有多个切面的切入点都匹配到了目标方法,那么在目标方法运行的时候,多个通知方法都会执行,那么就会产生一个先后顺序

通知顺序从先到后分别为:

  1. 环绕通知(Around Advice):环绕通知的执行优先于其他通知。它包裹着目标方法的执行,并可以在方法执行前后进行额外的处理。环绕通知可以决定是否调用目标方法,也可以自定义目标方法的输出结果。

  2. 前置通知(Before Advice):前置通知在目标方法执行前被调用。它可以用于执行一些预处理操作,例如参数校验、安全检查等。多个前置通知按照配置的先后顺序执行。

  3. 后置通知(After Advice):后置通知在目标方法执行后(不考虑方法是否出现异常)被调用。它可以用于执行一些清理操作,比如资源释放、记录操作日志等。多个后置通知按照配置的先后顺序执行。

  4. 返回通知(After Returning Advice):返回通知在目标方法成功执行并返回结果后被调用。它可以获取目标方法的返回值,并进行相应的处理。多个返回通知按照配置的先后顺序执行。

  5. 异常通知(After Throwing Advice):异常通知在目标方法抛出异常后被调用。它可以捕获目标方法抛出的异常,并进行相应的处理或记录错误信息。多个异常通知按照配置的先后顺序执行。

需要注意的是,同一个切面中的多个通知按照配置的先后顺序执行,而不同切面之间的通知执行顺序取决于切面的优先级。可以通过AOP框架的配置来控制通知的顺序。

切面优先级从前到后分别为:

  1. 注解配置优先级高:如果切面使用注解配置,并且配置了优先级属性,则优先级高于其他方式设置的切面。

  2. 显式设置优先级高:如果通过编程方式或XML配置显式设置了切面的优先级属性,优先级高于默认设置的切面。

  3. 默认设置:如果没有显式设置切面的优先级,AOP框架通常会给予切面一个默认的优先级顺序,例如按照切面加载的顺序确定优先级。

使用切面的优先级可以确保对同一个连接点的处理顺序,从而避免不同切面之间的冲突或干扰。

切入点表达式:

  • 切入点表达式:描述切入点方法的一种表达式。
  • 作用:主要用来决定项目中的哪些方法需要接入通知。

常见形式:

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

@Around("execution(public void com.example.MyClass.myMethod(..))")
public void aroundMyMethod(ProceedingJoinPoint joinPoint) throws Throwable {
 
}

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

@Around("@annotation(com.example.MyAnnotation)")
public void aroundAnnotatedMethods(ProceedingJoinPoint joinPoint) throws Throwable {
 
}

通配符描述切入点: 

  1. * 通配符:表示匹配零个或多个字符。在AOP中,* 通配符可以用于匹配任意数量的任意字符。例如,com.example.*Service 可以匹配任何以 “Service” 结尾的类名,并位于 “com.example” 包下的类。

  2. .. 通配符:表示匹配任意多层级的目录或包。在AOP中,.. 通配符可以用于匹配任意多层级的目录路径或包路径。例如,com.example..*Service 可以匹配任何以 “Service” 结尾的类,并位于 “com.example” 包及其子包下的类。

 扩展切入点表达式功能:

切入点表达式可以使用类似于正则表达式的语法,将上述元素组合起来进行更精确的匹配。同时,AOP框架也提供了一些特殊的语法和关键词来扩展切入点表达式的功能,例如:

  • &&:逻辑与操作符,用于将多个关键元素连接起来,表示需要同时满足多个条件。

  • ||:逻辑或操作符,用于将多个关键元素连接起来,表示满足任意一个条件即可。

  • !:逻辑非操作符,用于对关键元素的匹配结果取反。

  • @target:用于匹配目标类上应用了特定注解的连接点。

  • @within:用于匹配目标类及其子类上应用了特定注解的连接点。

切入点表达式的准确使用可以帮助开发人员精确地选择目标连接点,并将切面逻辑应用到指定的位置,避免不必要的拦截和干扰,提高AOP的效率和精度。

总结:

                本文我们对AOP中的一些知识点进行了深入解析,而这些知识点在实际使用中的利用程度很高,因此我们要熟练的掌握这些知识点。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

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

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

相关文章

【类加载子系统】

文章目录 1. 内存结构2. 类加载器与类的加载过程3. 类加载器分类4. 双亲委派机制 1. 内存结构 Class 文件类加载子系统运行时数据区 方法区堆程序计数器虚拟机栈本地方法栈 执行引擎本地方法接口本地方法库 2. 类加载器与类的加载过程 类加载器子系统负责从文件系统或者网络中加…

基于树种优化的BP神经网络(分类应用) - 附代码

基于树种优化的BP神经网络(分类应用) - 附代码 文章目录 基于树种优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.树种优化BP神经网络3.1 BP神经网络参数设置3.2 树种算法应用 4.测试结果:5.M…

旅美经济学家向凌云在美获对冲基金之父威廉·雅克颁授美国文化奖

2023年9月22日,第三届LABA偶像奖(LABA ICON AWARDS )「美国文化奖」颁奖典礼在美国洛杉矶比佛利山庄四季酒店举办。美国本土、欧洲、亚洲都有众多艺术家、经济学家和各行业优秀人才积极参与其中。 对冲基金之父威廉雅克(William Jacques)向经济学家Dr. Lingyun Xiang 向凌云颁发…

【进程管理】认识系统调用函数fork

目录 前言 一.查看进程的pid 二.父子进程 三.查看进程的第二种方式 四.代码创建进程——fork 1.fork的功能 2.fork的返回值 3.fork代码的一般写法 五.对于fork的理解 1.fork干了些什么? 2.fork为什么给子进程返回0,给父进程返回子进程的pid&…

大数据与Hadoop入门理论

一、大数据的3种数据类型 1、结构化数据 可定义,有类型、格式、结构的强制约束 如:RDBMS(关系型数据库管理系统) 2、非结构化数据 没有规律没有数据约束可言,很复杂难以解析 如:文本文件,视…

第86步 时间序列建模实战:Transformer回归建模

基于WIN10的64位系统演示 一、写在前面 这一期,我们介绍Transformer回归。 同样,这里使用这个数据: 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Renal Sy…

Casdoor系统static任意文件读取漏洞

文章目录 Casdoor系统static任意文件读取漏洞复现0x01 前言0x02 漏洞描述0x03 影响平台0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 Casdoor系统static任意文件读取漏洞复现 0x01 前言 免责声明:请勿利用文章内的相关技术从事非法测试,由…

郁金香2021年游戏辅助技术中级班(七)

郁金香2021年游戏辅助技术中级班(七) 058-C,C写代码HOOK分析封包数据格式A059-C,C写代码HOOK分析封包数据格式B-detours劫持060-C,C写代码HOOK分析封包数据格式C-过滤和格式化061-C,C写代码HOOK分析封包数据格式D-写入配置文件062-C,C写代码HOOK分析封包…

容器运行elasticsearch安装ik分词非root权限安装报错问题

有些应用默认不允许root用户运行,来确保应用的安全性,这也会导致我们使用docker run后一些操作问题,用es安装ik分词器举例(es版本8.9.0,analysis-ik版本8.9.0) 1. 容器启动elasticsearch 如挂载方式&…

第二证券:A股“业绩底”已现?两大板块被看好

9月,A股商场经历了一段明显的缩量下跌,成交量持续萎缩,增量资金不足,商场“痛感”激烈。跟着国庆十一长假结束,2023年四季度正式敞开,大都分析人士和私募安排都认为,国内经济预期转好将为A股商场…

蓝桥杯每日一题2023.10.7

跑步锻炼 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 简单枚举&#xff0c;对于2的情况特判即可 #include<bits/stdc.h> using namespace std; int num, ans, flag; int m[13] {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; bool is_ren(int n) {if((n %…

3d渲染农场全面升级,好用的渲染平台值得了解

什么是渲染农场&#xff1f; 渲染农场是专门从事 3D 渲染的大型机器集合&#xff0c;称为渲染节点&#xff0c;这些机器组合在一起执行一项任务&#xff08;渲染 3D 帧和动画&#xff09;。通过将渲染工作分配给数百台机器&#xff0c;可以显着减少渲染时间&#xff0c;从而使…

STM32F030在使用内部参考电压 (VREFINT)时与STM32G070的区别

背景&#xff1a; 之前使用过STM32G070的内部参考电压来提升ADC采集的准确度&#xff08;STM32使用内部参考电压提高ADC采集准确度&#xff09;&#xff0c;所以本次使用STM32F030的芯片时直接把之前G070的代码拿过来用了&#xff0c;但是出现了问题。 查找资料发现两者不同&am…

go语言判断管道是否关闭的误区

前言 本文是探讨的是"在Go语言中&#xff0c;我们是否可以使用读取管道时的第二个返回值来判断管道是否关闭?" 样例 在Go语言中&#xff0c;我们是否可以使用读取管道时的第二个返回值来判断管道是否关闭? 可以看下面的代码 package mainimport "fmt"…

步进电机S曲线驱动模块

一、电路 带有CAN及485接收&#xff0c;三个光耦接口&#xff0c;TMC2660电机驱动芯片&#xff0c;stm32f103的主控芯片 二、协议 一般来说&#xff0c;板子之间的通信协议格式通常为&#xff1a; 内容 帧头 长度 类型1 类型2 Data 校验 帧尾 字节数 1 1 1 1 N 2 1 帧头为0xB…

二叉树--二叉树最大深度

文章前言&#xff1a;如果有小白同学还是对于二叉树不太清楚&#xff0c;作者推荐&#xff1a;二叉树的初步认识_加瓦不加班的博客-CSDN博客 二叉树最大深度-力扣 104 题 &#xff08;不知道“后序遍历”的小白同学&#xff0c;请先看&#xff1a;二叉树的初步认识_加瓦不加班…

组件的挂载和渲染

React的挂载和渲染 React的生命周期中包括三个主要的阶段&#xff1a;挂载、渲染以及卸载。 很多小伙伴包括我自己可能对挂载和渲染的概念比较模糊&#xff0c;今天这篇文章主要的目的是为了解答我们的这个小疑惑~ 这张图是从其他地方搬运过来的&#xff0c;这张图中描述的主…

直播间自动点赞第一章:MouseEvent 实现根据坐标X,Y自动点击浏览器的效果

最终项目 制作一个自动点赞的浏览器插件&#xff0c;可以根据用户指定一个浏览器区域&#xff0c;进行自动化点击&#xff0c;其中可以设置参数&#xff1a;点击频率、指定区域。 本章节效果 指定了一块区域&#xff0c;进行点击&#xff0c;这边是模拟直播间实现自动化点击 …

【Java 进阶篇】JDBC数据库连接池Druid工具类详解

在Java应用程序中&#xff0c;数据库连接是一种重要的资源&#xff0c;因为每次创建和销毁数据库连接都会产生开销&#xff0c;降低了系统性能。为了高效地管理数据库连接&#xff0c;降低资源消耗&#xff0c;常常使用数据库连接池。Druid是一个功能强大的数据库连接池&#x…

成品短视频App源码:10个最热门的功能模块详解

作为成品短视频App源码领域的专家&#xff0c;我将为您揭开成品短视频App的神秘面纱。在这篇文章中&#xff0c;我将详细介绍这热门应用背后的10个最受欢迎的功能模块。无论您是想开发一款创新的短视频App&#xff0c;还是寻找适合您业务的现成解决方案&#xff0c;本文都会为您…