Spring之AOP

发布于:2025-05-13 ⋅ 阅读:(17) ⋅ 点赞:(0)

什么是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 切入点表达式,用于匹配标识有特定注解的方法

 


网站公告

今日签到

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