介绍
在Spring Boot 中,AOP(面向切面编程)通常通过通知(Advice)来实现,通知定义了切面的具体行为,具体行为如下。
环绕通知 @Around
- 包围目标方法执行,在方法执行前后都可以添加额外的逻辑。
- 可以控制目标方法的执行,手动调用目标方法并处理其返回值。
@Around("execution(* com.example.service.*.*(..))")
public Object aroundServiceMethods(ProceedingJoinPoint joinPoint) throws Throwable {
// Before advice logic
Object result = joinPoint.proceed(); // 执行目标方法
// After advice logic
return result;
}
前置通知 @Before
- 在目标方法执行前执行。
- 可以用于执行一些准备操作,如参数校验、权限检查等。
@Before("execution(* com.example.service.*.*(..))")
public void beforeServiceMethods() {
// Before advice logic
}
后置通知 @AfterReturning
- 在目标方法正常执行后执行。
- 可以获取到方法的返回值(如果有返回值的话),并可以根据返回值进行相应的处理。
@AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result")
public void afterReturningServiceMethods(Object result) {
// After returning advice logic
}
最终通知 @After
- 在目标方法执行后(不论是正常返回还是异常退出),都会执行最终通知。
- 主要用于资源清理、日志记录等无论如何都需要执行的操作。
@After("execution(* com.example.service.*.*(..))")
public void afterServiceMethods() {
// After (finally) advice logic
}
异常通知 @AfterThrowing
- 在目标方法抛出异常后执行。
- 可以捕获特定的异常类型,并进行相应的异常处理逻辑。
@AfterThrowing(pointcut = "execution(* com.example.service.*.*(..))", throwing = "ex")
public void afterThrowingServiceMethods(Exception ex) {
// After throwing advice logic
}
切入点 @Pointcut
如果有很多切入点需要重复写,写多了反而臃肿。可以使用Pointcut定义。
@After("execution(* com.example.service.*.*(..))")
@AfterReturning("execution(* com.example.service.*.*(..))")
@Around("execution(* com.example.service.*.*(..))")
@Pointcut("execution(* com.example.service.*.*(..))")
public void serviceMethods() {}
@After("serviceMethods()")
@AfterReturning("serviceMethods()")
@Around("serviceMethods()")