SpringBoot系列:通过AOP+注解优雅实现操作日志记录

在现代化的Java Web开发中,操作日志记录是不可或缺的一部分。它能够帮助我们追踪用户行为、审计日志和分析系统性能。在Spring Boot项目中,使用面向切面编程(AOP)结合自定义注解,可以优雅地实现操作日志记录功能。本文将通过示例详细介绍如何实现这一功能。

1. 创建自定义注解

首先,我们需要创建一个自定义注解,用于标记需要记录日志的方法。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD) // 注解应用于方法
@Retention(RetentionPolicy.RUNTIME) // 注解在运行时可用
public @interface LogOperation {
    String value() default ""; // 操作描述
}

2. 创建一个切面类

接下来,我们需要创建一个切面类,来实现操作日志的记录逻辑。使用Aspect注解来定义一个切面,使用@Around注解来包裹被@LogOperation注解的方法。

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class LogAspect {

    private static final Logger logger = LoggerFactory.getLogger(LogAspect.class);

    @Pointcut("@annotation(logOperation)") // 切点:标注了@LogOperation注解的方法
    public void logPointcut(LogOperation logOperation) {}

    @Around("logPointcut(logOperation)") // 环绕通知
    public Object around(ProceedingJoinPoint joinPoint, LogOperation logOperation) throws Throwable {
        // 获取方法名称
        String methodName = joinPoint.getSignature().getName();
        // 获取参数
        String params = Arrays.toString(joinPoint.getArgs());

        // 记录执行前日志
        logger.info("开始执行方法:{},描述:{},参数:{}", methodName, logOperation.value(), params);

        // 执行目标方法
        Object result;
        try {
            result = joinPoint.proceed();
        } catch (Exception e) {
            // 记录异常信息
            logger.error("方法执行异常:{}", e.getMessage());
            throw e; // 重新抛出异常
        }

        // 记录执行后日志
        logger.info("方法执行完毕:{},结果:{}", methodName, result);
        return result;
    }
}

3. 使用自定义注解

我们可以在任何需要记录日志的方法上使用@LogOperation注解,注解的value属性可以用于描述操作。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {

    @GetMapping("/test")
    @LogOperation("测试接口")
    public String test() {
        return "操作成功!";
    }
}

4. 总结

通过以上步骤,我们使用AOP结合自定义注解,实现了优雅的操作日志记录功能。这样的设计不仅使得代码结构清晰,而且也可以很方便地扩展和维护。

这种方式的好处在于,日志记录的关注点从业务逻辑中分离出来,保持了代码的整洁。此外,也降低了日志记录与业务逻辑之间的耦合度,便于后期的改进和维护。

希望通过本篇文章,能够给你在Spring Boot项目中实现操作日志记录带来启发和帮助。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部