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执行流程
二、通知类型
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)
五、连接点
在Spring中用JoinPoint抽象了连接点,用它可以获得方法执行时的相关信息,如目标类名、方法名、方法参数等。
1.对于@Around通知,获取连接点信息只能使用ProceedingJoinPoint
2.对于其他四种通知,获取连接点信息只能使用JoinPoint,他是ProceedingJoinPoint的父类型