【Spring】SpringAOP详解,彻底了解切点通知,附有注解和XML开发完整流程

发布于:2025-03-14 ⋅ 阅读:(19) ⋅ 点赞:(0)

SpringAOP

概念

image-20250313140655748

快速入门

需求

image-20250313140746461

导入依赖

image-20250313140802751

xml文件开启aop支持

image-20250313140825703

自定义aspect切面类

在类上加上@Component和@Aspect
使用@Pointcut注解来指定要被增强的方法
使用@Before注解来给我们的增强代码所在的方法进行标识,并且指定了增强代码是在被增强方法执行之前执行的。

在这里插入图片描述

这里的@Pointcut注解就定义了一个切点,表示在这些包下所有的方法增强
需要定义一个没有方法体的方法作为切入点表达式的一个标识
如果有很多个切点,就需要对应写多个无方法体的方法来做标识

结构

image-20250313141404849

service类代码加@Service注解

image-20250313141416639
image-20250313141421238

测试类只调用deleteAll方法

image-20250313141429629

结果输出

image-20250313141438825


专业名词

image-20250313141538636

image-20250313141646212

代理类

有了AOP增强的对象,通过.getBean获取的对象不是之前的对象,而是代理对象
那么没有AOP增强的对象通过.getBean获取的对象是之前的对象


切点

切点表达式

image-20250313142453221

image-20250313142457652

返回值类型,包名,类名,方法名,参数

image-20250313142544924


切点函数

@annotation

可以自定义哪些方法需要增强

1.自定义注解@InvokeLog(名称任意)

image-20250313143110763

2.给需要增强的方法上增加我们的注解

image-20250313143240912

3.在切面类使用@annotation(自定义注解全类名)

image-20250313143301383


通知

通知分类

image-20250313143600452

伪代码用于理解执行时机

image-20250313143649786

环绕通知@Around

方法参数获取ProceedingJoinPont对象
通过对象调用proceed()执行目标方法
然后try-catch
在任意位置写增强代码

image-20250313143954587

通过给通知方法传递ProceedingJoinPont对象参数
然后在try-catch中用这个对象调用proceed()方法,也就是增强目标方法
就可以把增强的方法写在1234任意位置


获取被增强方法的信息

只有获取了被增强方法的信息才能有效的增强方法,而不是简单的输出语句

我们可以在除了环绕通知外的所有通知方法中增加一个JoinPoint类型的参数。
这个参数封装了被增强方法的相关信息。
我们可以通过这个参数获取到除了异常对象和返回值之外的所有信息。

一般通过.getSignature()获取签名封装对象后再去.get其他方法


获取增强方法的返回值和异常对象

需要在方法参数上增加一个对应类型的参数
并且使用注解的属性进行配置。这样Spring会把你想获取的数据赋值给对应的方法参数。

image-20250313145437702

返回值在@AfterReturning里使用,异常对象在@AfterThrowing里使用
因为注解有多个参数,所以value不能省略了

在通知方法中就可以通过传递参数用ret. 和t.去使用获取到的东西了


环绕通知获取信息

image-20250313150554592

该参数的proceed()方法被调用相当于被增强方法被执行
调用后的返回值就相当于被增强方法的返回值。

注意事项

如果有返回值,在通知方法也要有返回值
return的是通知方法的返回值,不是增强方法的返回值,只是获取到了增强方法的返回值通过通知方法返回
可以进行篡改

image-20250313150733178

注解方式配置AOP完整流程

结构

image-20250313150802279

依赖

image-20250313150820020

xml文件

image-20250313150827322

自定义注解

image-20250313150835632

切面类

image-20250313150852915

实现类

image-20250313150913473

工具类略

测试类

image-20250313150926862

XML配置AOP(可跳过)

定义切面类
没有@Aspect@Pointcut@Around等注解,
但是要放到spring容器中,要加@Component注解

目标类和切面类都要放到容器中

image-20250313151121278

依赖

image-20250313151139740

xml文件配置

image-20250313151147224


多切面顺序问题

在实际项目中我们可能会存在配置了多个切面类的情况。这种情况下我们很可能需要控制切面的顺序。
我们在默认情况下Spring有它自己的排序规则。(按照类名排序)

如果是注解方式配置的AOP可以在切面类上加@Order注解来控制顺序。@Order中的属性越小优先级越高。
如果是XML方式配置的AOP,可以通过调整配置顺序来控制。

下面这种配置方式就会先使用CryptAspect里面的增强,在使用APrintLogAspect里的增强

image-20250313151220505


网站公告

今日签到

点亮在社区的每一天
去签到