当前位置: 首页 > 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 切入点表达式,用于匹配标识有特定注解的方法

 

相关文章:

  • Windows中安装nacos-server-2.4.2
  • webpack和vite区别
  • 《Python星球日记》 第52天:反向传播与优化器
  • MySQL事务和JDBC中的事务操作
  • Veins同时打开SUMO和OMNeT++的GUI界面
  • Visual Studio 2022 远程调试
  • C++字符串操作 2024年信息素养大赛复赛 C++小学/初中组 算法创意实践挑战赛 真题详细解析
  • 蓝桥杯嵌入式第十一届省赛真题
  • `RotationTransition` 是 Flutter 中的一个动画组件,用于实现旋转动画效果
  • 仓库管理系统,Java+Vue,含源码及文档,高效管理仓库物资,实现入库、存储、出库全流程数字化精准管控
  • 睿思量化小程序
  • Redis 哨兵
  • AI 入门资源:微软 AI-For-Beginners 项目指南
  • #Redis黑马点评#(四)优惠券秒杀
  • 基于定制开发开源AI智能名片S2B2C商城小程序的公私域流量融合运营策略研究
  • mac u盘重装mac10.15Catalina系统
  • 【递归、搜索和回溯】二叉树中的深搜
  • 绑定 SSH key(macos)
  • 《Python星球日记》 第51天:神经网络基础
  • JS较底层的用法,几类简单介绍
  • 乌外长:乌方准备无条件停火至少30天
  • 人民日报钟声:平等对话是解决大国间问题的正确之道
  • 一热就出汗 VS 热死都不出汗的人,哪个更健康?
  • 75岁亚当·费舍尔坐镇,再现80分钟马勒《第九交响曲》
  • 两部门部署中小学幼儿园教师招聘工作:吸纳更多高校毕业生从教
  • 常州市委原常委、组织部部长陈翔调任江苏省民宗委副主任