当前位置: 首页 > news >正文

Spring之AOP

什么是AOP

AOP:Aspect 0riented Programming(面向切面编程、面向方面编程),可简单理解为就是面向特定方法编程。

场景:案例中部分业务方法运行较慢,定位执行耗时较长的接口,此时需要统计每一个业务方法的

执行耗时。

优势:

1.减少重复代码

2.代码无侵入

3.提高开发效率

4.维护方便

AOP核心概念

连接点:JoinPoint,可以被AOP控制的方法(暗含方法执行时的相关信息)

通知:Advice,指那些重复的逻辑,也就是共性功能(最终体现为一个方法)

切入点:PointCut,匹配连接点的条件,通知仅会在切入点方法执行时被应用

切面:Aspect,描述通知与切入点的对应关系(通知+切入点)

目标对象:Target,通知所应用的对象

AOP执行流程

 通知类型

根据通知方法执行时机的不同,将通知类型分为以下常见的五类:

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

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

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

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

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

注意1:

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

 注意2:

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

@Pointcut

该注解的作用是将公共的切点表达式抽取出来,需要用到时引用该切点表达式即可

通知顺序

当有多个切面的切入点都匹配到了目标方法,目标方法运行时,多个通知方法都会被执行。

执行顺序: 

- 不同切面类中,默认按照切面类的类名字母排序目标

        - 方法前的通知方法:字母排名靠前的先执行目标

        - 方法后的通知方法:字母排名靠前的后执行

- 用 @0rder(数字)加在切面类上来控制顺序

        - 目标方法前的通知方法:数字小的先执行

        - 目标方法后的通知方法:数字小的后执行

切入点表达式

介绍:描述切入点方法的一种表达式。

作用:用来决定项目中的哪些方法需要加入通知

常见形式:

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

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

- 主要根据方法的返回值、包名、类名、方法名、方法参数等信息来匹配,语法为:

- 其中带 ?的表示可以省略的部分

        1.访问修饰符:可省略(比如:public、protected)

        2.包名.类名: 可省略

        3. throws 异常:可省略(注意是方法上声明抛出的异常,不是实际抛出的异常)

- 可以使用通配符描述切入点

*:单个独立的任意符号,可以通配任意返回值、包名、类名、方法名、任意类型的一个参数,也可以通配包、类、方法名的一部分

..:多个连续的任意符号,可以通配任意层级的包,或任意类型、任意个数的参数

 注意1:

根据业务需要,可以使用 且(&&)、或()、非(!)来组合比较复杂的切入点表达式

切入点表达式-@annotation

@annotation 切入点表达式,用于匹配标识有特定注解的方法

 

http://www.xdnf.cn/news/371179.html

相关文章:

  • 信息检索(包含源码)
  • 服务预热原理
  • 动态路由EIGRP的配置
  • AutoGen+Deepseek+chainlit的简单使用
  • iOS瀑布流布局的实现(swift)
  • HNUST湖南科技大学-软件测试期中复习考点(保命版)
  • Kubernetes应用发布方式完整流程指南
  • Dia浏览器:AI驱动浏览网页,究竟怎么样?(含注册申请体验流程)
  • Harness: 全流程 DevOps 解决方案,让持续集成如吃饭般简单
  • 【字节拥抱开源】字节豆包团队开源首发 Seed-Coder 大模型
  • QSFP+、QSFP28、QSFP-DD接口分别实现40G、100G、200G/400G以太网接口
  • Flask 调试的时候进入main函数两次
  • 机器学习扫盲系列-深入浅出“反向传播”(二)
  • 第21天打卡
  • 流动式起重机Q2考试的实操部分,重点复习内容包括哪些方面?
  • 路由策略和策略路由的区别以及配置案例
  • 【C++指南】STL容器的安全革命:如何封装Vector杜绝越界访问与迭代器失效?
  • 图像处理篇---opencv实现坐姿检测
  • 系统级编程(四):利用windows API使用操作系统剪切板
  • [学习]RTKLib详解:rtksvr.c与streamsvr.c
  • Vue基础(8)_监视属性、深度监视、监视的简写形式
  • 扩容 QCOW2 磁盘镜像文件
  • 将循环队列中的各元素向右移动n步collections.deque.rotate(n)
  • 当可视化遇上 CesiumJS:突破传统,打造前沿生产配套方案
  • K8S服务的请求访问转发原理
  • Octave 绘图快速入门指南
  • jdk多版本切换,通过 maven 指定编译jdk版本不生效,解决思路
  • 【金仓数据库征文】_金仓数据库在金融行业的两地三中心容灾架构实践
  • 黑马k8s(二)
  • Laravel 安全:批量赋值 fillable 与 guarded