GlobalExceptionHandler是如何被加载的

GlobalExceptionHandler是如何被加载的

GlobalExceptionHandler是如何被加载的

ExceptionHandlerExceptionResolver类中实现了InitializingBean接口表面是在启动时初始化ExceptionHandlerExceptionResolver的bean时加载的。

initExceptionHandlerAdviceCache首先从容器中找到所有的带@ControllerAdvice注解的类(@RestControllerAdvice注解是@ControllerAdvice和@ResponseBody组合的注解)。可以看到这里找到了我们自定义的GlobalExceptionHandler。
在这里插入图片描述
然后遍历所有adviceBeans,将这些adviceBeans都转换为ExceptionHandlerMethodResolver,转换过程中扫描每个ControllerAdvice中的带@ExceptionHandler注解的方法,再取出这些ExceptionHandler所处理的Exception类型,可能会有多个,然后以exceptionType,为key,method为value放入mappedMethods这个map中进行缓存。

然后将adviceBean放入ExceptionHandlerExceptionResolver的exceptionHandlerAdviceCache这个map中进行缓存。
最后exceptionHandlerAdviceCache中的数据如下: