ExceptionHandlerExceptionResolver类源码解析

一. ExceptionHandlerExceptionResolver异常处理过程

先从入口着手,如下图:

整体逻辑很明显:1. 判断是否匹配这个异常处理,如果不匹配则直接返回null;否则进行第二步;2. 预先处理响应(基本是添加响应头等处理,具体可以看方法体),接着进入第三步;3. 这个就是核心的异常处理逻辑方法体;

ExceptionHandlerExceptionResolver类源码解析_第1张图片

现在先看shouldApplyTo方法体的实现,主要是判断是否匹配handler,如下图:

ExceptionHandlerExceptionResolver类源码解析_第2张图片

接着看着prepareResponse方法体,然而里面没有多余处理逻辑,先忽略;

现在进去查看doResolveException方法体,最终进入如下图的方法体;

ExceptionHandlerExceptionResolver类源码解析_第3张图片

整体逻辑是获取ServletInvocableHandlerMethod实例,然后交由其去处理该异常()ServletInvocableHandlerMethod的处理逻辑后续通过DispatcherServlet处理请求来进行说明),现在主要去了解获取ServletInvocableHandlerMethod实例的处理过程;

ExceptionHandlerExceptionResolver类源码解析_第4张图片

整体逻辑是:1. 解析Handler类是否有ExceptionHandler注解标注的方法以及参数中是否有异常对象;接着判断抛出来的异常是否匹配,如果匹配则直接返回该方法去处理异常(说明handler实例中异常处理方法优先于ControllerAdiveBean中异常处理);2. 通过ControllerAdive注解标注的实例去匹配异常以及异常处理,匹配逻辑以及异常处理跟第一步相似;

所以,异常处理类来处理handler异常,要不就handler类中的异常处理,要不就是ControllerAdive的类来进行异常处理;

二. ExceptionHandlerExceptionResolver.exceptionHandlerAdviceCache的初始化过程

通过AfterProperties方法进行处理,如下图:

ExceptionHandlerExceptionResolver类源码解析_第5张图片

ExceptionHandlerExceptionResolver类源码解析_第6张图片

ExceptionHandlerExceptionResolver类源码解析_第7张图片

所以,通过ControllerAdive注解以及方法中的ExceptionHandler注解来指示该类中的方法去处理异常;

三. ExceptionHandlerMethodResolver构造过程解析

ExceptionHandlerExceptionResolver类源码解析_第8张图片

ExceptionHandlerExceptionResolver类源码解析_第9张图片

ExceptionHandlerExceptionResolver类源码解析_第10张图片

ControllerAdive注解以及ExceptionHandler注解的联合使用,来指明异常处理方法;

后续,简单实现ControllerAdive注解标注的类来进行异常处理;

 

你可能感兴趣的:(Spring,源码漫游)