目录
概述
AOP就是面向特定方法编程
在实现的时候,动态代理是切面编程最主流的实现,而SpringAOP是Spring框架的高级技术,旨在管理bean对象的过程中,主要通过底层的动态代理机制,对特定的方法进行编程
入门
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
@Slf4j
@Component
@Aspect//AOP类
public class timeAspect {
@Around("execution(* org.example.springquickstartaop.service.*.*(..))")//切入点表达式
public Object recordTime(ProceedingJoinPoint joinPoint) throws Throwable {
//记录开始时间
long begin=System.currentTimeMillis();
//调用原始方法运行
Object result=joinPoint.proceed();
//记录结束时间,计算方法执行耗时
long end=System.currentTimeMillis();
log.info("方法执行了{}",end-begin);
return result;
}
}
核心概念
通知类型
切入点表达式重复性高,所以可以抽取出来
@PointCut就是将公共的切入点表达式抽取出来,需要用到时引用该切点表达式即可
通知顺序
当有多个切面的切入点都匹配到了目标方法,目标方法运行时,多个通知方法都会被执行
1.不同切面类,按照默认切面类的类名字母排序
目标方法前的通知方法:字母排名靠前的先执行
目标方法后的通知方法:字母排名靠前的后执行
2.用@Order(数字)加在切面类上来控制顺序
目标方法前的通知方法:数字小的先执行
目标方法后的通知方法:数字大的后执行
切入点表达式
用来描述切入点方法的一种表达式,主要用来决定项目中哪些方法需要加入通知
常见形式
1.execution(......):根据方法的签名来匹配
2.@annotation(......):根据注解匹配