AOP

一、AOP

1.AOP

Aspect Oriented Programming(面向切面编程,面向方面编程),其实就是面向特定方法编程。

2.场景

(1)部分功能运行较慢,定位执行耗时较长的业务方法,此时需要统计每一个业务方法的执行耗时

(2)记录操作日志

(3)权限控制

(4)事务管理

4.优势

(1)代码无侵入

(2)减少重复代码

(3)提升开发效率

(4)维护方便

5.核心概念

(1)连接点:JoinPoint,可以被AOP控制的方法(暗含方法执行时的相关信息)。

(2)通知:Advice,指那些重复的逻辑,也就是共性功能(最终体现为一个方法)。

(3)切入点:PointCut,匹配连接点的条件,通知仅会在切入点方法执行时被应用。

(4)切面:Aspect,描述通知与切入点的对应关系(通知+切入点)。

(5)目标对象:Target,通知所应用的对象

6.AOP执行流程

image-20230728084340706

二、通知类型

1.类型

(1)@Around:环绕通知,此注解标注的方法在目标方法前、后都执行。

(2)@Before:前置通知,此注解标注的方法在目标方法前被执行。

(3)@After:后置通知,此注解标注的方法在目标方法后被执行。

(4)@AfterReturning:返回后通知,此注解标注的方法在目标方法后都被执行,有异常不会执行。

(5)@AfterThrowing:异常后通知,此注解标注的通知方法发生异常后执行。

2.注意事项

(1)@Around环绕通知需要自己调用ProceedingJoinPoint( ) 来让原始方法执行,其他通知不需要考虑目标方法执行。

(2)@Around环绕通知方法的返回值,必须定为Project,来接收原始方法的返回值。

3.@PointCut

该注解的作用是将公共的切入点表达式抽取出来,需要用到时引用该切入点表达式即可。

三、通知顺序

1.当有多个切面的切入点都匹配到了目标方法,目标方法运行时,多个通知方法都会执行。

2.执行顺序:

(1)不同切面类中,默认按照切面类的类字母排序:

  • 目标方法前的通知方法:字母排序靠前的先执行
  • 目标方法后的通知方法:字母排序靠后的先执行

(2)用Order(数字)加在切面类上来控制顺序:

  • 目标方法前的通知方法:数字小的先执行
  • 目标方法后的通知方法:数字小的先执行

四、切入点表达式

1.切入点表达式

描述切入点方法的一种表达式

2.作用:主要来决定项目中的那些方法需要加入通知

3.常见形式

(1)execution(...):根据方法的签名来匹配

(2)@ammotation(...):根据注解匹配

4.execution

(1)execution主要根据方法的返回值、包名、类名、方法名参数等信息来匹配,语法为:

​ execution(访问修饰符? 返回值 包名.类名.?方法名(方法参数) throws 异常?)

(2)其中带?的表示可以省略的部分

  • 访问修饰符:可省略(比如:public、protected)
  • 包名.类名:可省略
  • throws异常:可省略(注意是方法上声明抛出的一场,不是实际抛出的异常

(3)可以使用通配符描述切入点

  • *:单个独立的任意符号,可以通配任意返回值、包名、类名、方法名、任意类型的一个参数、也可以通配包、类、方法的一部分

    execution(* com.*.service.*.update*(*))

  • ..:多个连续的任意符号,可以通配任意层级的包,或任意类型、任意个数的参数

    execution(* com.tlias..DeptService.*(..))

5.@annotation

(1)@annotation切入点表达式,用于匹配表示有特定注解的方法。

(2)语法:@annotation(com.itheima.anno.Log)

image-20230728095907884

五、连接点

在Spring中用JoinPoint抽象了连接点,用它可以获得方法执行时的相关信息,如目标类名、方法名、方法参数等。

1.对于@Around通知,获取连接点信息只能使用ProceedingJoinPoint

2.对于其他四种通知,获取连接点信息只能使用JoinPoint,他是ProceedingJoinPoint的父类型

posted @ 2023-07-28 10:24  __YJC  阅读(5)  评论(0编辑  收藏  举报