目录
实现步骤:
1 导入AOP依赖
2 编写切面Aspect
3 编写通知方法
4 指定切入点表达式
5 测试AOP动态织入
图示:
实现步骤:
1 导入AOP依赖
<!-- Spring Boot AOP依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2 编写切面Aspect
@Aspect // 标记为切面类
@Component // 由Spring容器管理
public class LogAspect {
// 切入点表达式和通知方法在此定义
}
3 编写通知方法
通知方法(Advice) 是面向切面编程(AOP)中的核心概念,表示在目标方法(或切入点)的某个执行阶段插入的增强逻辑。通俗来说,就是“在某个地方(切入点)做某件事(增强逻辑)”。
通知方法的类型
Spring AOP 提供了5种通知类型,对应不同的执行时机:
注解 | 执行时机 | 典型场景 |
---|---|---|
@Before | 目标方法执行前 | 参数校验、权限验证 |
@After | 目标方法执行后(无论是否抛出异常) | 资源清理、日志记录 |
@AfterReturning | 目标方法正常返回后(无异常时执行) | 记录结果、缓存数据 |
@AfterThrowing | 目标方法抛出异常后 | 异常处理、告警通知 |
@Around | 包围目标方法(可自定义方法执行前后逻辑,甚至阻止方法执行) | 性能监控、事务管理 |
代码实现:
package org.example.spring02.aspect;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class LogAspect {
public void logStart() {
System.out.println("【切面-日志】开始");
}
public void logEnd() {
System.out.println("【切面-日志】结束");
}
public void logReturn() {
System.out.println("【切面-日志】返回");
}
public void logException() {
System.out.println("【切面-日志】异常:");
}
}
4 指定切入点表达式
作用:通过表达式定义哪些方法需要被拦截。
语法结构:
execution([访问权限] 返回类型 包名.类名.方法名(参数类型) [异常类型])
代码实现:
精确指定接口的路径:
@Before("execution(int org.example.spring02.MathMethod.MathCalculator.*(..))")
public void logStart() {
System.out.println("【切面-日志】开始");
}
package org.example.spring02.aspect;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Component
@Aspect
public class LogAspect {
@Before("execution(int *(int,int))")
public void logStart() {
System.out.println("【切面-日志】开始");
}
@After("execution(int *(int,int))")
public void logEnd() {
System.out.println("【切面-日志】结束");
}
@AfterReturning("execution(int *(int,int))")
public void logReturn() {
System.out.println("【切面-日志】返回");
}
@AfterThrowing("execution(int *(int,int))")
public void logException() {
System.out.println("【切面-日志】异常:");
}
}
5 测试AOP动态织入
package org.example.spring02;
import org.example.spring02.MathMethod.MathCalculator;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class AopTest {
@Autowired
MathCalculator mc;
@Test
public void test01() {
int add = mc.add(1, 2);
System.out.println(add);
}
}