
什么是AOP?
什么是面向切面编程呢?
什么是面向特定方法编程呢? 比如上个章节学习的 "登录校验",就是一类特定问题。登录校验拦截器,就是对 "登录校验" 这类问题的统一处理。所以,拦截器也是 AOP 的一种应用。AOP 是一种思想,拦截器是 AOP 思想的一种实现。Spring 框架实现了这种思想,提供了拦截器技术的相关接口。 同样的,统一数据返回格式和统一异常处理,也是 AOP 思想的一种实现。
简单来说:AOP 是一种思想,是对某一类事情的集中处理。
而 Spring AOP 是 Spring 框架提供的基于代理的面向切面编程实现,用于在不修改源代码的前提下对程序进行增强。比如说统一管理日志打印、权限控制、事务管理等重复、与业务无关的逻辑。
需求:统计图书系统各个接口方法的执行时间。
首先在 pom.xml 文件中添加配置:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>记录 Controller 中每个方法的执行时间
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Slf4j
@Aspect
@Component
public class TimeAspect {
/**
* 记录方法耗时
*/
@Around("execution(* com.example.demo.controller.*.*(..))")
public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {
// 记录方法执行开始时间
long begin = System.currentTimeMillis();
// 执行原始方法
Object result = pjp.proceed();
// 记录方法执行结束时间
long end = System.currentTimeMillis();
// 记录方法执行耗时
log.info(pjp.getSignature() + "执行耗时: {}ms", end - begin);
return result;
}
}@Aspect:标识这是一个切面类@Around:环绕通知,在目标方法的前后都会被执行,后面的表达式表示对哪些方法进行增强。ProceedingJoinPoint.proceed():执行原始方法,也就是指定要运行的那些方法💥注意事项:
pjp.proceed() 的结果对象 result,则会导致程序死循环或功能异常。@Around 时,必须调用 pjp.proceed() 方法。controller,否则浏览器访问的时候可能携带了其他访问资源,而后端因为拦截所有资源路径而导致不断重定向尝试,最后缓存炸了。整个代码划分为三部分:

通过上面的程序,也可以感受到 AOP 面向切面编程的一些优势:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。