Aop实现简单基于日志记录
目录
一、基础知识:
二、测试记录接口的参数和结果
一、基础知识:
- @Before:用于执行目标方法之前的逻辑。
- @After:用于执行目标方法之后的逻辑。
- @AfterReturning:用于获取目标方法返回值后的逻辑。
- @AfterThrowing:用于处理目标方法抛出异常后的逻辑。
- @Around:用于在目标方法执行前后执行逻辑,并可控制是否执行目标方法。
- @Pointcut:用于定义切入点,指定哪些方法将被通知。
二、测试记录接口的参数和结果
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Loggable {
String value() default "";
}
@Aspect
@Component
@Slf4j
public class LoggingAspect {
@Pointcut("@annotation(loggable)")
public void loggableMethod(Loggable loggable) {}
@Around("loggableMethod(loggable)")
public Object logAround(ProceedingJoinPoint joinPoint, Loggable loggable) throws Throwable {
// 获取方法名和参数
String methodName = joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
log.info("Starting method: {}", methodName);
log.info("Request parameters: {}", Arrays.toString(args));
// 调用目标方法并获取返回值
Object result = joinPoint.proceed();
log.info("Finished method: {}", methodName);
log.info("Response: {}", result);
return result; // 返回结果
}
@Before("loggableMethod(loggable)")
public void logBefore(JoinPoint joinPoint, Loggable loggable) {
log.info("Starting method: {}", joinPoint.getSignature().getName());
log.info("Request parameters: {}", Arrays.toString(joinPoint.getArgs()));
}
@After("loggableMethod(loggable)")
public void logAfter(JoinPoint joinPoint, Loggable loggable) {
log.info("Finished method: {}", joinPoint.getSignature().getName());
}
}
结果: