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. 维护⽅便
相关推荐
何以解忧,唯有..6 分钟前
Redis 过期事件监听:原理与实战
java
明月_清风8 分钟前
用自然语言控制 Blender:开源项目 Blender MCP 深度介绍
人工智能·后端
风中的小熊生气18 分钟前
Spring Boot 面试知识(二):分层、IoC、异常、配置与 Redis
java·springboot
泡茶喝茶写代码18 分钟前
量化数据开发实战系列(第 25 篇):基金基础接口实战:基金列表、ETF-LOF 分类、基金概况、净值数据
java·数据库·人工智能·python·mysql
shehuiyuelaiyuehao1 小时前
算法46,分治快排,排序数组
java·算法·排序算法·排序
JaguarJack1 小时前
Whim 是什么?一门把 PHP 被否决的设想真跑起来的实验语言
后端·php·服务端
野生技术架构师1 小时前
1200 道 JAVA 面试题(各大企业常见面试题及答案)
java·开发语言
careathers1 小时前
【数据结构】栈
java·数据结构
明月_清风1 小时前
MHS:AI Agent 开始连接物理世界
人工智能·后端·网络协议
ssshooter1 小时前
Node.js 天生就是异步的,为什么还要消息队列?
javascript·后端·面试