Spring Boot中很多Advice后缀的注解和类,都是干什么的

在Spring Boot中,"Advice"这个词确实出现在不同的上下文中,主要分为两大职责:面向切面编程(AOP)中的增强(Advice)用于全局控制器增强的特定注解(如 @ControllerAdvice 。它们的核心思想都是提供一种拦截和增强原有逻辑的能力。

下面这个表格帮你快速梳理这些概念的区别和联系。

概念类别 具体名称 主要职责 关键注解/类
AOP 增强 (Advice) 通知/增强 在目标方法执行的特定点(如前后、异常时)注入通用逻辑(如日志、事务、安全)。 @Before, @After, @Around
控制器增强 (Controller Advice) 控制器增强 为所有或多个控制器提供统一的异常处理、数据绑定、模型数据预处理。 @ControllerAdvice, @RestControllerAdvice

💡 详解 AOP 中的增强(Advice)

AOP 允许你将遍布在应用多处的通用功能(横切关注点)模块化。Advice定义了 "做什么""何时做"

  • @Before :在目标方法执行前运行通知。适用于参数校验、权限检查等 。
  • @AfterReturning :仅在目标方法成功执行后运行通知。适用于记录返回结果等 。
  • @AfterThrowing :在目标方法抛出异常后运行通知。适用于专门的异常日志记录和错误报警 。
  • @After :在目标方法执行后运行通知,无论成功还是异常。适用于资源清理等 。
  • @Around :功能最强大的通知,可以完全控制目标方法的执行。它可以在方法执行前后添加自定义行为,甚至可以决定是否执行目标方法。适用于性能监控、事务管理等 。

执行顺序 :当多个通知作用于同一个连接点时,它们的执行顺序是有规律的。例如,一个 @Around通知会包裹整个执行过程,其内部会按 @Before→ 目标方法 → @AfterReturning/@AfterThrowing@After的顺序执行 。

🌐 理解控制器的增强(Controller Advice)

@ControllerAdvice@RestControllerAdvice(后者是 @ControllerAdvice@ResponseBody的组合)用于编写全局的控制器增强器,它们可以应用到所有的控制器上,实现三大功能 :

  • 全局异常处理 (@ExceptionHandler) :在一个地方集中处理从各个控制器抛出的异常,避免在每个控制器中重复编写 try-catch 块 。
  • 全局数据绑定 (@InitBinder) :预配置如何将 HTTP 请求参数绑定到模型数据上。例如,全局定义日期字符串的格式 。
  • 全局模型属性 (@ModelAttribute) :在控制器方法执行前,自动向模型(Model)中添加一些公共数据,比如当前登录用户信息 。

两者如何选择?

  • 当你需要拦截并增强 任意类的方法 (如Service层的方法)时,应使用 AOP Advice
  • 当你需要对 控制器(Controller) 进行统一的增强,如异常处理、数据预处理时,应使用 @ControllerAdvice

简单实例

AOP Advice 示例(记录方法执行时间)

less 复制代码
@Aspect
@Component
public class LoggingAspect {
    @Around("execution(* com.example.service.*.*(..))")
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        Object proceed = joinPoint.proceed(); // 执行目标方法
        long executionTime = System.currentTimeMillis() - start;
        System.out.println(joinPoint.getSignature() + " executed in " + executionTime + "ms");
        return proceed;
    }
}

@ControllerAdvice 示例(全局异常处理)

kotlin 复制代码
@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(UserNotFoundException.class)
    public ResponseEntity<String> handleUserNotFound(UserNotFoundException ex) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
    }
}
相关推荐
游浪踏9 小时前
003_AI Agent(模拟实现)
后端·agent
PieroPC9 小时前
nicegui 3.4.0 + sqlite3 做一个简单维修登记系统
后端
用户7543888677159 小时前
HarmonyOS BLE 快速上手
后端
禅思院9 小时前
在win10上配置 Rust以及修改默认位置问题
开发语言·前端·后端·rust·cargo·mingw64·cargo安装位置
武子康9 小时前
大数据-188 Logstash Output 插件实战:stdout/file/Elasticsearch 输出配置与调优
大数据·后端·logstash
我命由我1234510 小时前
Python Flask 开发问题:ImportError: cannot import name ‘escape‘ from ‘flask‘
服务器·开发语言·后端·python·flask·学习方法·python3.11
爱吃烤鸡翅的酸菜鱼10 小时前
Spring Boot 注解全栈指南:涵盖 Bean 注册、配置加载、请求映射、事务控制、数据校验等一网打尽
java·开发语言·spring boot·后端·spring
running up10 小时前
Spring IOC与DI核心注解速查表
java·后端·spring
洛阳泰山10 小时前
快速上手 MaxKB4J:开源企业级 Agentic 工作流系统在 Sealos 上的完整部署指南
java·人工智能·后端
bybitq10 小时前
string,byte,rune,character?详解Golang编码-UTF-8
开发语言·后端·golang