进入Controller前的异常 和 Service 层异常
@ControllerAdvice:
范围: 全局,适用于所有控制器。
目的: 用于全局配置异常处理和提供全局模型属性。
方法: 在带有 @ControllerAdvice 注解的类中的被注解方法将适用于整个应用程序的所有控制器。
用途:
全局异常处理:使用 @ExceptionHandler 注解在 @ControllerAdvice 中的方法可以处理应用程序中任何控制器抛出的异常。
全局模型属性:使用 @ModelAttribute 注解在 @ControllerAdvice 中的方法可以为每个控制器添加模型属性。
@ControllerAdvice
public class GlobalControllerAdvice {@ExceptionHandler(Exception.class)public String handleException(Exception e) {// 全局处理异常}@ModelAttributepublic void globalAttributes(Model model) {model.addAttribute("globalAttribute", "这是一个全局属性");}
}
原理:
拦截器(Interceptors):
Spring MVC 中的拦截器允许在请求被处理前和处理后执行一些操作。@ControllerAdvice 的实现主要依赖于 Spring 拦截器机制。在拦截器中,@ControllerAdvice 可以拦截并处理控制器抛出的异常,实现全局的异常处理。
AOP(Aspect-Oriented Programming):
@ControllerAdvice 还利用了 AOP 的思想,特别是在异常处理方面。通过使用 @ExceptionHandler 注解,@ControllerAdvice 实际上是声明了一个切面,该切面用于捕获和处理特定类型的异常。
全局异常解析器(Global Exception Resolvers):
Spring MVC 中的全局异常解析器负责捕获控制器抛出的异常并采取相应的行动。@ControllerAdvice 实际上就是定义了一个全局异常解析器。
组件扫描:
Spring 框架通过组件扫描机制来扫描带有 @ControllerAdvice 注解的类。一旦这些类被扫描到,Spring 就会将它们注册为全局异常处理器。
模型属性处理:
@ModelAttribute 注解用于将模型属性添加到所有控制器的模型中。这也是 @ControllerAdvice 的一部分,它通过 AOP 提供了一种全局配置的方式。