SpringBootWeb 篇 - 深入了解 AOP 面向切面编程与 AOP 记录操作日志案例

面向切面编程(AOP,Aspect-Oriented Programming)是一种用于更好地模块化的编程范式,特别适用于划分关注点,如日志记录、安全性等横切关注点。在 Spring 框架中,AOP 被广泛使用,能够让开发者在不修改核心业务逻辑的情况下,动态地给方法添加一些额外的功能。

一、AOP 的基本概念

在 Spring 中,AOP 主要由以下几个核心概念构成:

  1. 切面(Aspect):切面是一个类,包含了与某些特定功能相关的逻辑。
  2. 连接点(Join Point):连接点是指程序执行过程中的某个点,例如方法调用、异常处理等。
  3. 通知(Advice):通知是在连接点上执行的动作,分为前置通知、后置通知、异常通知、环绕通知等。
  4. 切入点(Pointcut):切入点定义了在哪些连接点上应用通知。

二、使用 AOP 记录操作日志

下面我们通过一个案例,来展示如何使用 Spring AOP 记录操作日志。

  1. 添加依赖

pom.xml 中添加 Spring AOP 的依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
  1. 定义切面

创建日志切面类 LoggingAspect,用于记录方法的执行过程:

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

@Aspect
@Component
public class LoggingAspect {
    private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);

    @Around("execution(* com.example.demo.service.*.*(..))")
    public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
        // 日志开始时间
        long start = System.currentTimeMillis();

        logger.info("方法开始执行: " + joinPoint.getSignature().getName());

        Object proceed = joinPoint.proceed(); // 执行方法

        // 日志结束时间
        long executionTime = System.currentTimeMillis() - start;

        logger.info("方法执行结束: " + joinPoint.getSignature().getName() + ",执行时间: " + executionTime + "ms");

        return proceed;
    }
}

在上面的代码中,我们使用了 @Aspect 注解声明了一个切面,并通过 @Around 注解指定了切入点。在方法执行前后记录日志,并计算方法执行时间。

  1. 应用示例

接下来创建一个简单的服务类,记录其方法调用日志:

import org.springframework.stereotype.Service;

@Service
public class UserService {
    public String findUserById(Long id) {
        // 模拟业务处理
        try {
            Thread.sleep(200); // 模拟耗时操作
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "User " + id;
    }
}
  1. 测试 Controller

我们可以通过一个控制器来测试我们的 AOP 日志记录功能:

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

@RestController
public class UserController {
    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/user/{id}")
    public String getUser(@PathVariable Long id) {
        return userService.findUserById(id);
    }
}
  1. 启动项目

最后,启动 Spring Boot 应用,访问接口 /user/1,在控制台日志中你会看到类似如下的输出:

方法开始执行: findUserById
方法执行结束: findUserById,执行时间: 205ms

三、总结

通过以上案例,我们展示了如何在 Spring Boot 中使用 AOP 来记录操作日志。AOP 使得横切关注点(如日志、监控)与核心业务逻辑解耦,提高了代码的可维护性和可读性。随着项目需求的发展,你可以根据实际需要灵活调整切点和通知,实现更加丰富的功能。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部