文章目录
今天在使用SpringAop的时候,在代码运行过程中,突然发生了异常,作者仔细检查了代码,最终发现,是因为SpringBoot所依赖的版本不同,导致SpringAop的执行顺序发生了变化导致的。
低版本SpringBoot Aop测试
SpringBoot 2.0.4.RELEASE版本依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<!--SpringMVC的启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Spring AOP的启动器依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
</dependencies>
Controller层接口
@RestController
@RequestMapping("user")
public class UserController {
@GetMapping
public String user() {
System.out.println("[Controller]执行controller方法");
return "正常执行";
}
@GetMapping("e")
public String e() {
System.out.println("[Controller]执行controller方法:异常之前");
int i = 1 / 0;
System.out.println("[Controller]执行controller方法:异常之后");
return "发生异常";
}
}
AOP代码
@Aspect
@Component
public class LogAop {
@Pointcut("execution(public * com.hrp.controller.*.*(..))")
public void logAop() {
}
@Before("logAop()")
public void doBefore() {
System.out.println("[AOP]===================doBefore===================");
}
@AfterReturning("logAop()")
public void doAfterReturning(JoinPoint joinPoint) {
System.out.println("[AOP]===================doAfterReturning===================");
}
@AfterThrowing(value = "logAop()", throwing = "e")
public void doAfterThrowing(JoinPoint joinPoint, Exception e) {
System.out.println("[AOP]===================doAfterThrowing===================");
}
@After("logAop()")
public void doAfter() {
System.out.println("[AOP]===================doAfter===================");
}
@Around("logAop()")
public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("[AOP]===================doAround before===================");
Object result = proceedingJoinPoint.proceed();
System.out.println("[AOP]===================doAround after===================");
return result;
}
}
AOP执行结果
- 正常执行
[AOP]===================doAround before===================
[AOP]===================doBefore===================
[Controller]执行controller方法
[AOP]===================doAround after===================
[AOP]===================doAfter===================
[AOP]===================doAfterReturning===================
- 发生异常
[AOP]===================doAround before===================
[AOP]===================doBefore===================
[Controller]执行controller方法:异常之前
[AOP]===================doAfter===================
[AOP]===================doAfterThrowing===================
更换高版本的SpringBoot依赖
SpringBoot 2.3.2.RELEASE版本依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/>
</parent>
AOP执行结果
- 正常执行
[AOP]===================doAround before===================
[AOP]===================doBefore===================
[Controller]执行controller方法
[AOP]===================doAfterReturning===================
[AOP]===================doAfter===================
[AOP]===================doAround after===================
- 发生异常
[AOP]===================doAround before===================
[AOP]===================doBefore===================
[Controller]执行controller方法:异常之前
[AOP]===================doAfterThrowing===================
[AOP]===================doAfter===================
测试结果
- SpringBoot 2.0.4.RELEASE版本
- SpringBoot 2.3.2.RELEASE版本