spring AOP详解

发布时间:2023年12月20日

介绍:
?? ?什么是AOP?
?? ??? ?AOP:Aspect Oriented Programming(面向切面编程、面向方面编程),其实就是面向特定方法编程。

?? ??? ?场景:案例中部分业务方法运行较慢,定位执行耗时较长的接口,此时需要统计每一个业务方法的执行耗时。

?? ??? ?优点:
?? ??? ??? ?减少重复代码
?? ??? ??? ?代码无侵入
?? ??? ??? ?提高开发效率
?? ??? ??? ?维护方便

AOP基础:
?? ?AOP快速入门:
?? ??? ?引入依赖:
?? ??? ??? ?<dependency>? ? <groupId>org.springframework.boot</groupId>? ? <artifactId>spring-boot-starter-aop</artifactId></dependency>

?? ??? ?编写aop程序:
?? ??? ??? ?@Slf4j
//@Aspect ? // 表示当前类就是aop类
//@Component
public class TimeAspect {

? ? @Around("execution(* com.sde.service.impl.DeptServiceImpl.*(..))")
? ? public Object recordTime(ProceedingJoinPoint point) throws Throwable {
? ? ? ? //获取调用执行时间
? ? ? ? long begin = System.currentTimeMillis();

? ? ? ? //调用原始方法执行
? ? ? ? Object result = point.proceed();

? ? ? ? //获取调用方法结束时间

? ? ? ? long end = System.currentTimeMillis();

? ? ? ? //数据日志
? ? ? ? log.info("执行方法耗时{}ms",end - begin);

? ? ? ? //返回原始方法执行的结果
? ? ? ? return result;
? ? }
}
?? ?AOP核心概念:
?? ??? ?连接点:JoinPoint,可以被AOP控制的方法(暗含方法执行时的相关信息
?? ??? ?通知:Advice,指那些重复的逻辑,也就是共性功能(最终体现为一个方法)

?? ??? ?切入点:PointCut,匹配连接点的条件,通知仅会在切入点方法执行时被应用
?? ??? ?切面:Aspect,描述通知与切入点的对应关系(通知+切入点)

?? ??? ?目标对象:Target,通知所应用的对象


AOP进阶:
?? ?通知类型:
?? ??? ?@Arround:环绕通知,此注解标注的地方在目标方法前,后都会被执行。
?? ??? ?@Before:前置通知,此注解标注的通知方法在目标方法前被执行。
?? ??? ?@After:后置通知,此注解标注的通知方法在目标方法后被执行,无论是否有异常都被执行。
?? ??? ?@AfterReturning:返回后通知,此注解标注的通知方法在目标发方法后被执行,有异常不会执行。
?? ??? ?@AfterThrowing:异常后通知,此注解标注的通知方法发生异常后执行。
?? ?通知顺序:
?? ??? ?当有多个切面的切入点都匹配到了目标方法,目标方法运行时,多个通知方法都会被执行。

?? ??? ?执行顺序:
?? ??? ??? ?不同切面类,默认按照切面类的类名字母排序:
?? ??? ??? ??? ?目标方法前在通知方法:字母排名靠前先执行。
?? ??? ??? ??? ?目标方法后的通知方法:字母排名靠前的后执行。
?? ??? ??? ?用@Order(数字)加在切面类上来控制顺序:
?? ??? ??? ??? ?目标方法前的通知方法:数字小的先执行

?? ??? ??? ??? ?目标方法后的通知方法:数字小的后执行

?? ?切入点表达式:
?? ??? ?介绍:
?? ??? ??? ?描述切入点方法的一种表达式。
?? ??? ?作用:
?? ??? ??? ?用来决定项目中的哪些方法需要加入通知
?? ??? ?常见形式:
?? ??? ??? ?execution(……):根据方法的签名来匹配

?? ??? ??? ?@annotation(……) :根据注解匹配

?? ??? ?execution:主要根据方法的返回值,包名,类名,方法名,方法参数等信息来匹配。
?? ??? ??? ?execution(访问修饰符? ?返回值 ?包名.类名.?方法名(方法参数) throws 异常?)

?? ??? ??? ?可以使用通配符描述切入点:
?? ??? ??? ??? ?其中带 ?的表示可以省略的部分。
?? ??? ??? ??? ??? ?1,访问修饰符:可以省略(比如:public,protected)
?? ??? ??? ??? ??? ?2,包名:可省略
?? ??? ??? ??? ??? ?3,throws 异常:可省略(注意是方法上声明抛出的异常,不是实际抛出的异常)

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

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

?? ??? ??? ??? ?根据业务需要,可以使用 且(&&)、或(||)、非(!) 来组合比较复杂的切入点表达式
?? ??? ?@annotation
?? ??? ??? ?子主题 1
?? ?连接点:

AOP案例:
?

文章来源:https://blog.csdn.net/weixin_64502989/article/details/135095761
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。