Spring Boot AOP 切面注解
warning:
这篇文章距离上次修改已过431天,其中的内容可能已经有所变动。
在Spring Boot中,使用AOP切面可以在不修改原始代码的情况下增加额外的行为,例如日志记录、事务管理、权限校验等。以下是一个使用@Aspect注解定义切面的简单例子:
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class MyAspect {
// 定义切点,这里以服务层的所有公共方法为例
@Pointcut("execution(public * com.example.service.*.*(..))")
public void serviceLayerMethods() {
}
// 在切点方法执行前执行
@Before("serviceLayerMethods()")
public void beforeMethod(JoinPoint joinPoint) {
System.out.println("Before method: " + joinPoint.getSignature());
}
// 在切点方法成功执行后执行
@AfterReturning("serviceLayerMethods()")
public void afterReturningMethod(JoinPoint joinPoint) {
System.out.println("After returning method: " + joinPoint.getSignature());
}
// 在切点方法抛出异常后执行
@AfterThrowing("serviceLayerMethods()")
public void afterThrowingMethod(JoinPoint joinPoint) {
System.out.println("After throwing method: " + joinPoint.getSignature());
}
// 在切点方法执行后执行(无论成功与否)
@After("serviceLayerMethods()")
public void afterMethod(JoinPoint joinPoint) {
System.out.println("After method: " + joinPoint.getSignature());
}
// 环绕通知,可以在方法执行前后执行自定义逻辑
@Around("serviceLayerMethods()")
public Object aroundMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("Around before method: " + proceedingJoinPoint.getSignature());
Object result = proceedingJoinPoint.proceed();
System.out.println("Around after method: " + proceedingJoinPoint.getSignature());
return result;
}
}在这个例子中,我们定义了一个切面MyAspect,它将会在com.example.service包下所有公共方法执行时被应用。我们使用了不同的注解来定义了五种不同的通知类型:
@Before:在切点方法执行前执行。@AfterReturning:在切点方法成功执行后执行。@AfterThrowing:在切点方法抛出异常后执行。@After:在切点方法执行后执行(无论成功与否)。@Around:环绕通知,可以在方法执行前后执行自定义逻辑。
这些通知方法都可以注入JoinPoint,它代表了当前连接点的信息,例如目标对象和执行的方法等。对于@Around注解的方法,我们可以使用ProceedingJoinPoint,它继承自JoinPoint,并提供了proceed()方法来执行目标方法。
要使切面生效,需要确保Spring Boot应用程序扫描到这个切面类,并且通过@EnableAspectJAutoProxy注解开
评论已关闭