Spring AOP结合注解实现接口层操作日志记录

注解可以方便快捷地给方法或类加上标记,用于识别它们的作用。在Spring AOP中,我们可以通过在方法上使用注解来实现操作日志记录。本文将介绍如何使用Spring AOP结合注解实现接口层操作日志记录。

注解可以方便快捷地给方法或类加上标记,用于识别它们的作用。在Spring AOP中,我们可以通过在方法上使用注解来实现操作日志记录。本文将介绍如何使用Spring AOP结合注解实现接口层操作日志记录。

  1. 添加依赖

在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
    <version>2.5.5</version>
</dependency>
  1. 创建注解

首先,我们需要创建一个注解,标记需要记录操作日志的接口方法。可以根据实际需求自定义注解的名称和属性。以下是一个示例:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
    String value() default "";
}

这个注解取名为Log,只能标记在方法上,并且定义了一个名为value的属性,默认值为空字符串。

  1. 创建切面

接下来,我们需要创建一个切面,来拦截标记了Log注解的接口方法,并记录操作日志。以下是一个示例:

@Aspect
@Component
public class LogAspect {
    @Autowired
    private Logger logger;

    @Pointcut("@annotation(com.example.demo.annotation.Log)")
    public void logPointCut() {}

    @Around("logPointCut()")
    public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();

        String className = joinPoint.getTarget().getClass().getName();
        String methodName = method.getName();
        String logMsg = method.getAnnotation(Log.class).value();

        Object[] args = joinPoint.getArgs();
        try {
            Object result = joinPoint.proceed();
            logger.info("{}-{}:{}-result:{}", className, methodName, logMsg, result);
            return result;
        } catch (Throwable throwable) {
            logger.error("{}-{}:{}-exception:{}", className, methodName, logMsg, throwable.getMessage());
            throw throwable;
        }
    }
}

首先,我们用注解@Aspect将这个切面声明为一个切面。然后,用注解@Component将其声明为一个Spring组件,以便被识别。

在这个切面中,我们定义了一个切点logPointCut(),用于匹配标记了Log注解的接口方法。

然后,在切面中,我们使用@Around注解来标记一个环绕通知,用于在执行接口方法之前和之后执行一些操作。

在环绕通知中,我们首先通过joinPoint.getSignature()方法获取方法的签名,进而获取方法名和类名。然后,使用method.getAnnotation(Log.class)方法获取Log注解的属性值,并将其记录到日志中。

在记录日志之前,我们先获取接口方法的参数,然后使用joinPoint.proceed()方法执行接口方法,并获取返回值。最后,将返回值记录到日志中。

如果接口方法执行出现异常,我们也要记录异常信息,并将其抛出。

  1. 标记接口方法

最后,我们需要在需要记录操作日志的接口方法上标记Log注解,例如:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    @Log("添加用户")
    public void addUser(User user) {
        userDao.addUser(user);
    }

    @Override
    @Log("删除用户")
    public void deleteUser(int userId) {
        userDao.deleteUser(userId);
    }
}

在这个示例中,我们在addUser方法和deleteUser方法上分别标记了Log注解,并指定了需要记录的操作名称。

  1. 测试

现在,我们就可以直接注入UserService服务,并调用其方法,观察操作日志是否被记录了。例如:

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @PostMapping("/addUser")
    public void addUser(@RequestBody User user) {
        userService.addUser(user);
    }

    @DeleteMapping("/deleteUser/{userId}")
    public void deleteUser(@PathVariable int userId) {
        userService.deleteUser(userId);
    }
}

注:需要注意的是,上述示例的logger对象需要我们自己定义。

以上就是使用Spring AOP结合注解实现接口层操作日志记录的完整攻略和示例说明。通过这种方式记录操作日志,可以方便地查看操作记录,帮助我们更好地监控系统运行状况。

本文标题为:Spring AOP结合注解实现接口层操作日志记录

基础教程推荐