AOP概述
AOP:Aspect Oriented Programming(面向切面编程、面向方面编程),其实就是面向特定方法编程
场景
当我们写一个项目的时候,我们发现这个项目的部分功能运行较慢,我们想要定位执行耗时较长的业务方法,此时需要统计每一个业务方法执行耗时
我们是不是可以这样来写,但是一个项目那么多方法,一个一个的这样去写是不是很麻烦
那么我们是不是可以把公共部分的代码提取出来,当调用某个功能业务时,先运行获取方法运行开始时间这部分代码,再运行功能业务的代码,最后运行获取方法运行结束时间,计算耗时的这部分代码。相信大家已经发现了,这和动态代理技术其实是差不多的
实现
SpringAOP
动态代理是AOP最主流的实现,而SpringAOP是Spring框架的高级技术,旨在管理bean对象的过程中,主要通过底层的动态代理机制,对特定的方法进行编程。
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
编写AOP程序
针对于特定方法根据业务需要进行编程
@Component
@Aspect //AOP类
@Slf4j
public class TimeAspect {
@Around("execution(* org.orange.thisweb.service.*.*(..))")//切入表达式,用来指定以下代码逻辑作用于哪些方法
public Object recordTime(ProceedingJoinPoint joinPoint) throws Throwable {
//记录开始时间
long begin = System.currentTimeMillis();
//调用原始方法
Object result = joinPoint.proceed();
//记录结束时间,计算耗时
long end = System.currentTimeMillis();
(joinPoint.getSignature()+"方法执行耗时:{}ms",end - begin);
return result;
}
}
优势
代码无侵入,没有修改原始的方法,对原始方法进行增强或者改变
减少重复代码
提高开发效率
维护方便
AOP核心概念
连接点:JoinPoint,可以被AOP控制的方法(暗含方法执行时的相关信息)
通知:Advice,指哪些重复的逻辑,也就是共性功能(最终体现为一个方法)
切入点:PointCut,匹配连接点的条件,通知仅会在切入点方法执行时被应用(实际被AOP控制的方法)
切面:Aspect,描述通知与切入点的对应关系(通知+切入点)
目标对象:Target,通知所应用的对象
AOP执行流程
springAOP底层是基于动态带来技术来实现的,在程序运行的时候,会自动基于动态代理技术为目标对象生成一个代理对象,在代理对象中就会对目标对象的原始方法进行功能的增强。