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