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

Spring AOP从0到1

Spring有两大核心:

        1、IoC 控制反转

        2、AOP 面向切面编程

AOP:切面就是指某⼀类特定问题, 所以AOP也可以理解为面向特定⽅法编程.

引入AOP依赖

<dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-aop</artifactId>

</dependency>

Spring AOP详解

1、分为5个核心

1.1、切点(Pointcut)

Pointcut 的作⽤就是提供⼀组规则 (使⽤ AspectJ pointcut expression language 来描述), 告诉程序对哪些⽅法来进⾏功能增强

上⾯的表达式execution(* com.example.aop.aspect.*.*(..))就是切点表达式.

1.2、连接点

满足切点表达式规则的⽅法, 就是连接点. 也就是可以被AOP控制的⽅法

所有com.example.aop.aspect路径下的方法都是连接点

1.3、通知

通知就是具体要做的⼯作, 指哪些重复的逻辑,也就是共性功能(最终体现为⼀个⽅法)

比如上述程序中记录业务⽅法的耗时时间, 就是通知

1.4、切面

切⾯(Aspect) = 切点(Pointcut) + 通知(Advice)

切⾯既包含了通知逻辑的定义, 也包括了连接点的定义.

2、通知类型

  1. @Around: 环绕通知, 此注解标注的通知⽅法在⽬标⽅法前, 后都被执⾏
  2. @Before: 前置通知, 此注解标注的通知⽅法在⽬标⽅法前被执⾏
  3. @After: 后置通知, 此注解标注的通知⽅法在⽬标⽅法后被执⾏, ⽆论是否有异常都会执⾏
  4. @AfterReturning: 返回后通知, 此注解标注的通知⽅法在⽬标⽅法后被执⾏, 有异常不会执⾏
  5. @AfterThrowing: 异常后通知, 此注解标注的通知⽅法发⽣异常后执⾏

3、@PointCut

上面的代码可以看到,路径是很多重复的切点,要是更改的话,会非常麻烦,Spring提供了 @PointCut 注解, 把公共的切点 表达式提取出来, 需要⽤到时引⽤该切⼊点表达式即可

结果如下:

3、切⾯优先级 @Order

当我们在⼀个项⽬中, 定义了多个切⾯类时, 并且这些切⾯类的多个切⼊点都匹配到了同⼀个⽬标⽅法. 当⽬标⽅法运⾏的时候, 这些切⾯类中的通知⽅法都会执⾏, 那么这⼏个通知⽅法的执⾏顺序是什么样的呢?

当我们创建3个切面类之后的打印如下:

存在多个切⾯类时, 默认按照切⾯类的类名字⺟排序:
  1. @Before 通知:字⺟排名靠前的先执⾏
  2. @After 通知:字⺟排名靠前的后执⾏

但这样的排序,在工作中是不方便的,所以我们要借助注解@Order

排序会根据注解@Order里面的数字进行排序,数字越大越靠后

AOP面向切面编程的⼀些优势:

  1. 代码⽆侵⼊: 不修改原始的业务⽅法, 就可以对原始的业务⽅法进⾏了功能的增强或者是功能的改
  2. 减少了重复代码
  3. 提⾼开发效率
  4. 维护⽅便

http://www.lryc.cn/news/2379236.html

相关文章:

  • JavaScript 中的 Document 对象详解
  • archlinux按键映射按键自定义
  • 【python】字典和数组的数组
  • 软考IPSEC案例分析
  • C++(23):容器类<vector>
  • Hugo 安装保姆级教程(搭建个人blog)
  • tomcat查看状态页及调优信息
  • 从坏道扫描到错误修复:HD Tune实战指南
  • 将嵌入映射到 Elasticsearch 字段类型:semantic_text、dense_vector、sparse_vector
  • 【LeetCode 热题100】17:电话号码的字母组合(详细解析)(Go语言版)
  • 解决uni-app开发中的“TypeError: Cannot read property ‘0‘ of undefined“问题
  • 翻译:20250518
  • 西门子1200/1500博图(TIA Portal)寻址方式详解
  • 《Python星球日记》 第78天:CV 基础与图像处理
  • 踩坑:uiautomatorviewer.bat 打不开
  • Atcoder Beginner Contest 406
  • 记录一次win11本地部署deepseek的过程
  • 嵌入式STM32学习——外部中断EXTI与NVIC的基础练习⭐
  • 进程状态并详解S和D状态
  • 数据获取_Python
  • <前端小白> 前端网页知识点总结
  • 历史数据分析——宁波海运
  • 小结:jvm 类加载过程
  • OpenCv高阶(八)——摄像头调用、摄像头OCR
  • Java开发经验——阿里巴巴编码规范实践解析3
  • MySQL——6、内置函数
  • MySQL如何查看某个表所占空间大小?(表空间大小查看方法)
  • 软件架构之-论软件系统架构评估以及应用
  • 低延迟与高性能的技术优势解析:SmartPlayer VS VLC Media Player
  • pytorch小记(十九):深入理解 PyTorch 的 `torch.randint()` 与 `.long()` 转换