AOP(Aspect Oriented Programming):面向切面编程、面向方法编程,其实就是面向特定方法编程
场景:
实现:
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
主流实现是动态代理。SpringAOP是Spring框架的高级技术,旨在管理bean对象的过程中,主要通过底层的动态代理机制,对特定方法进行编程——运行的就是代理对象
@Slf4j
@Component
@Aspect // AOP类
public class TimeAspect {
// 加在哪些方法上
@Around("execution(* com.example.server.*.*(..))") // 切入点表达式
public Object recordTime(ProceedingJoinPoint jointPoint) throws Throwable {
// 1. 记录开始时间
long begin = System.currentTimeMillis();
// 2. 调用原始方法运行
Object result = jointPoint.proceed();
// 3. 记录结束时间,计算方法执行耗时
long end = System.currentTimeMillis();
log.info(jointPoint.getSignature() + "方法耗时:{}ms", end - begin);
return result;
}
}
核心概念:
注意事项:
如果是public修饰的切入点,其他类中也能进行调用
切面类类名,before正序,after倒序
用@Order(数字)加在切面类上来控制顺序,前数字小的先执行,后数字小的后执行
切入点表达式: 描述切入点方法的一种表达式
作用: 主要用来决定项目中哪些方法需要加入通知
常见形式:
1)execution(…):根据方法的签名来匹配,多个可以使用逻辑运算符连接——常用
书写建议
2)@annotation(…):根据注解匹配——不规则或不好描述的时候使用
自定义一个注解,在需要加切入点表达式的方法上加上自定义注解,@annotation(注解的全类名)
可以在通知中获取连接点的相关信息——像反射部分
可以篡改目标方法执行的结果