SpringBoot使用AOP详解
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class LoggingAspect {
// 匹配com.example.demo包下所有类的所有方法
@Pointcut("execution(* com.example.demo..*.*(..))")
public void loggingPointcut() {
}
// 在匹配的方法执行前执行
@Before("loggingPointcut()")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Method: " + joinPoint.getSignature().getName() + " starts");
}
// 在匹配的方法执行后执行
@After("loggingPointcut()")
public void logAfter(JoinPoint joinPoint) {
System.out.println("Method: " + joinPoint.getSignature().getName() + " ends");
}
// 在匹配的方法执行过程中出现异常时执行
@AfterThrowing(pointcut = "loggingPointcut()", throwing = "ex")
public void logAfterThrowing(JoinPoint joinPoint, Throwable ex) {
System.out.println("Method: " + joinPoint.getSignature().getName() + " throws exception: " + ex.getMessage());
}
// 在匹配的方法成功执行后执行
@AfterReturning(pointcut = "loggingPointcut()", returning = "result")
public void logAfterReturning(JoinPoint joinPoint, Object result) {
System.out.println("Method: " + joinPoint.getSignature().getName() + " returns: " + result);
}
// 环绕通知,可以在方法执行前后自定义行为
@Around("loggingPointcut()")
public Object logAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("Method: " + proceedingJoinPoint.getSignature().getName() + " is being executed");
Object result = proceedingJoinPoint.proceed();
System.out.println("Method: " + proceedingJoinPoint.getSignature().getName() + " has executed");
return result;
}
}
这个例子展示了如何在Spring Boot应用中使用AOP来记录方法的执行情况,包括方法开始执行、执行结束、抛出异常以及返回结果。同时,使用@Around
可以自定义方法执行的行为,例如参数修改、异常处理或者条件判断是否执行原方法。
评论已关闭