Spring Boot AOP 切面注解
在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
注解开
评论已关闭