目录
什么是AOP?
什么是Spring AOP?
Spring AOP 的实现
1. 引入依赖
2. 实现切面逻辑
概念理解
在软件开发中,面向切面编程(AOP)是一种强大的编程范式,它允许我们在应用程序的不同模块中提取横切关注点,而不是将它们分散到各个模块中。Spring 框架为 Java 开发者提供了一套强大的 AOP 工具,通过 Spring AOP,我们能够更加优雅地解决横切关注点的问题。
什么是AOP?
其实AOP就是一种思想,对某一类事情(切面)的集中处理。
大家想要更深的了解 面向切面编程(AOP)与 面向对象编程(OOP)可以看这个文章:
AOP与OOPhttp://t.csdnimg.cn/0FxBR
什么是Spring AOP?
AOP是⼀种思想, 它的实现⽅法有很多, 有Spring AOP,也有AspectJ、CGLIB等. Spring AOP是其中的⼀种实现⽅式.
Spring AOP是Spring框架的一个关键特性,它提供了一种方式来使应用程序的横切关注点(如日志、事务管理、安全性等)与核心业务逻辑相分离。
通过AOP,我们可以将这些关注点定义为切面,并将它们应用于应用程序的不同模块,而不是在每个模块中重复相同的代码。
假设当前有一个常场景:现在我们要观察一个方法(接口)的响应时间。
正常是出方法的时间 - 写入方法的时间
但是如果业务逻辑里再调用其他方法呢?调用的方法也调用其他方法呢?这样的话不就是同一类事情 mo,AOP 就能对此进行处理!!!
Spring AOP 的实现
1. 引入依赖
在项目的 pom.xml 引入依赖。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2. 实现切面逻辑
具体每一步标记在代码上
@Slf4j // 打印日志
@Aspect // 实现 AOP
@Component // 交给 Spring 管理
public class TimeRecordAspect {// 对哪些方法生效 第一个 * 是指 controller 包下的所有类,第二个指所有方法@Around("execution(* com.lpy.book.controller.*.*(..))") public Object record(ProceedingJoinPoint pj) throws Throwable {/** 切面逻辑:* 1. 记录开始时间* 2. 执行目标方法* 3. 记录结束时间* 4. 记录消耗时间*/// 1.long start = System.currentTimeMillis();// 2.Object result = pj.proceed();// 3.long end = System.currentTimeMillis();// 4./** pj.getSignature() : 上面路径中的方法*/log.info(pj.getSignature() + "cost time: " + (end - start) + "ms");return result;}}
概念理解
切面(Aspect): 切面是一组通知和切点的组合。通知定义了在何时、何地执行的代码,而切点定义了在应用程序中的哪些位置执行这些通知。
通知(Advice): 通知是在切面的特定切点上执行的代码。Spring AOP 提供了五种类型的通知:
@Before (前置通知) | 此注解标注的通知⽅法在⽬标⽅法前被执⾏ |
@After (后置通知) | 此注解标注的通知⽅法在⽬标⽅法后被执⾏, ⽆论是否有异常都会执⾏ |
@AfterReturning (返回后通知) | 此注解标注的通知⽅法在⽬标⽅法后被执⾏, 有异常不会执⾏ |
@AfterThrowing (异常后通知) | 此注解标注的通知⽅法发⽣异常后执⾏ |
@Around(环绕通知) | 此注解标注的通知⽅法在⽬标⽅法前, 后都被执⾏ |
切点(Pointcut): 切点是在应用程序中定义的一个或多个连接点的集合。通知将在这些连接点上执行。
连接点(Join Point): 连接点是在应用程序执行过程中可以插入切面的点。例如,方法的调用是一个连接点。
引入(Introduction): 引入允许我们向现有的类添加新方法或属性,而无需修改它们的源代码。