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

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.xdnf.cn/news/7068.html

相关文章:

  • STM32CubeMX生成UTF-8编码文件的设置方法
  • 第12章 Java多线程机制
  • 阶段四 项目1-苍穹外卖 第一章 Git
  • 基于matlab/simulink锂电池算法学习集合(SOC、SOH、BMS)
  • FloodFill算法:洪水般的图像处理艺术
  • #Redis黑马点评#(六)Redis当中的消息队列
  • 从0到1吃透卷积神经网络(CNN):原理与实战全解析
  • Java基于数组的阻塞队列实现详解
  • Qt音视频开发过程中一个疑难杂症的解决方法/ffmpeg中采集本地音频设备无法触发超时回调
  • 健康生活:养生实用指南
  • 浅谈无服务器WebSocket的优势
  • 什么是open BMC?
  • Spring AI Alibaba集成阿里云百炼大模型
  • 异常日志规范
  • 低功耗模式介绍
  • Java配置文件处理工具全解析
  • 人工智能赋能产业升级:AI在智能制造、智慧城市等领域的应用实践
  • 何首乌基因组-文献精读131
  • 代码上传gitte仓库
  • 【C语言练习】048. 使用递归进行树的遍历
  • 【软考 8T(n / 2)+n^2的时间复杂度如何计算?】
  • C++(21):fstream的读取和写入
  • DeepSeek系列核心技术与贡献总结
  • 生产级编排AI工作流套件:Flyte全面使用指南 — Data input/output
  • 互联网大厂Java面试:从基础到复杂场景的技术挑战
  • 二:操作系统之进程概念
  • Unity学习总结篇(1)关于各种坐标系
  • 信息学奥赛一本通1012:计算多项式的值
  • Spring-Beans的生命周期的介绍
  • python3.13版本降为3.12