文章目录
- [一、Spring Boot AOP简介](#一、Spring Boot AOP简介)
- 二、通知顺序
一、Spring Boot AOP简介
AOP(Aspect-Oriented Programming,面向切面编程)是对OOP(Object-Oriented Programming,面向对象编程)的补充。AOP通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。
在Spring Boot中,AOP主要通过注解和AspectJ来实现。主要的AOP注解有:
@Aspect
:定义切面类@Before
:前置通知@After
:后置通知@AfterReturning
:返回通知@AfterThrowing
:异常通知@Around
:环绕通知
二、通知顺序
1. 通知类型及其顺序
在Spring AOP中,通知按以下顺序执行:
@Around
(环绕通知)前半部分@Before
(前置通知)- 被代理的方法执行
@AfterReturning
(返回通知)或@AfterThrowing
(异常通知)@After
(后置通知)@Around
(环绕通知)后半部分
示例代码
java
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("logBefore() is running!");
}
@After("execution(* com.example.service.*.*(..))")
public void logAfter(JoinPoint joinPoint) {
System.out.println("logAfter() is running!");
}
@AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result")
public void logAfterReturning(JoinPoint joinPoint, Object result) {
System.out.println("logAfterReturning() is running!");
}
@AfterThrowing(pointcut = "execution(* com.example.service.*.*(..))", throwing = "error")
public void logAfterThrowing(JoinPoint joinPoint, Throwable error) {
System.out.println("logAfterThrowing() is running!");
}
@Around("execution(* com.example.service.*.*(..))")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("logAround() before is running!");
Object result = joinPoint.proceed();
System.out.println("logAround() after is running!");
return result;
}
}
2. 控制通知顺序
在不同的切面之间定义通知的执行顺序。可以使用@Order
注解。
示例代码
java
@Aspect
@Order(1)
@Component
public class FirstAspect {
@Before("execution(* com.example.service.*.*(..))")
public void beforeAdvice() {
System.out.println("FirstAspect beforeAdvice()");
}
}
@Aspect
@Order(2)
@Component
public class SecondAspect {
@Before("execution(* com.example.service.*.*(..))")
public void beforeAdvice() {
System.out.println("SecondAspect beforeAdvice()");
}
}
FirstAspect
的beforeAdvice
会先于SecondAspect
的beforeAdvice
执行。