📜  Spring Boot – 返回通知后的 AOP(1)

📅  最后修改于: 2023-12-03 15:35:03.113000             🧑  作者: Mango

Spring Boot – 返回通知后的 AOP

在 Spring Boot 中使用 AOP 是提高应用程序可重用性的一种方法。通过称之为“Aspect”的切面,AOP 提供了一个机制来将通用功能从一个或多个对象中分离出来并重用。

AOP 的一个重要概念是通知,它是代码在特定的连接点执行的一段代码。在 Spring Boot 中,通知通常用于执行横切关注点,如日志记录,性能监视和事务管理。

一个通知方法可以有以下几种类型:

  • 前置通知(@Before) - 方法执行之前调用
  • 后置通知(@After) - 方法正常执行之后调用
  • 返回通知(@AfterReturning) - 方法执行并成功返回之后调用
  • 异常通知(@AfterThrowing) - 方法执行时抛出异常时被调用
  • 环绕通知(@Around) - 方法执行前后都调用,可以控制方法的执行

这篇文章将主要介绍返回通知,并且演示如何在 Spring Boot 中通过 AOP 实现它。

基本概念

返回通知指的是在目标方法成功执行并返回后,执行的附加行为。在返回通知中,通知方法会收到目标方法的返回值。

示例代码

假设我们想要记录一些有关我们应用程序中访问用户的统计信息。为此,我们需要编写一个统计切面。该切面可以记录每个方法调用的名称、入参和返回值。下面是一个实现此目的的示例:

@Aspect
@Component
public class StatisticsAspect {
  
  private final Logger logger = LoggerFactory.getLogger(this.getClass());
  
  @Pointcut("execution(* com.example.controller..*.*(..))")
  public void webLayer() {}

  @AfterReturning(pointcut = "webLayer()", returning = "result")
  public void logMethodCall(JoinPoint jp, Object result) {
    String method = jp.getSignature().getName();
    Object[] args = jp.getArgs();
    logger.info("Method " + method + " called with args " + Arrays.toString(args) + " and returned " + result);
  }

}

该切面包含一个 Pointcut 和一个 AfterReturning 通知方法。Pointcut 定义了应该切入哪些方法。在本例中,我们只关心 com.example.controller 包中的方法。AfterReturning 定义了方法的返回处理逻辑。在本例中,我们将记录方法名称、参数和返回值。

使用

要使用切面,请将 StatisticsAspect 类注入到 Spring 上下文中。例如,可以通过在 Spring Boot 的主应用程序类中添加 @EnableAspectJAutoProxy 和 @ComponentScan 注释来完成以下操作:

@SpringBootApplication
@EnableAspectJAutoProxy
@ComponentScan(basePackages = "com.example.*")
public class MainApplication {
  public static void main(String[] args) {
    SpringApplication.run(MainApplication.class, args);
  }
}

现在,只需要访问应用程序中的任何带有 @RequestMapping 注释的方法即可看到日志记录信息。在日志记录信息中,我们会看到调用方法的名称、参数和返回值。

结论

通过使用返回通知,我们可以很容易地增加应用程序的可重用性和可维护性。切面允许我们将横切关注点集中在一起并重用它们。Spring Boot 中的 AOP 提供了一个实现此目的的快速而灵活的方法。