spring @ExceptionHandler 异常处理2
HandlerExceptionResolver
有了第一篇对于异常处理的简单的介绍之后,我们对于平常的使用来说还是基本的可以的,但是想了解spring的异常处理的体系原理,仅仅是简单的使用还是不行的,必须从代码层面去了解,了解到底为了我们做了什么样的事!想清楚的了解spring的处理原理,必须从spring的整个spring mvc的处理逻辑说起,慢慢的聊
从spring MVC的处理逻辑说起
spring mvc的处理逻辑,整体来说进行了多层封装,对于各种数据进行了抽象,方便我们进行各种扩展,这样的处理逻辑从简单上来讲就是我们传统的Servlet的处理过程:找到我们的映射的Servlet类,这样就找到了处理的方法,执行调用,返回结果;说白了一点spring也是专业的处理,只是处理的更加的专业;
简单来说:
1、定义HandlerMapping,处理前端请求过来定位到具体的映射到具体的Class某个类处理,早期的spring直接是一个处理类Controller对应一个映射,现在一个Class中可以对应对个HandlerMethod;HandlerMapping定义了一套规范,我们也可以定义自己的处理方式;
2:通过HandlerMapping处理类找到具体处理这个请求的对象之后,构造一个HandlerExecutionChain ,这个执行链其实提供了在调用具体Handler处理类之前提供了扩展的功能,可以在请求之前做过滤比如CORS、等等;
3:然后通过HandlerExcutionChain方法中对应的具体的Handler对象,找到他的适配器HandlerAdapter,这个HandlerAdapter的作用就是处理不同的HandlerMapping找到的Handler不一样,对应的处理真实调用的逻辑也是不一样的,所以需要一个适配类,然后反射调用,比如最简单的实现了Controller这个接口,需要通过反射调用这个方法,这里就适配啦,当然现在的处理逻辑,这个HandlerAdapter的处理逻辑远远不止这点,需要在进行反射调用之前做一些工作、反射调用后做一些工作,反射调用之前解决处理传入参数值的解析HandlerMethodArgumentResolver、返回值处理、HandlerMethodReturnValueHandler,我们也可以自定义哈哈,非常好用;
4:返回值等处理完成之后或者直接已经被消费啦,不用经过视图解析器ViewResolver,以前的jsp经常使用的ModeAndView的处理逻辑就是这样做的,最后针对生成的视图进行响应给具体的请求的客户端。
下图是执行的基本的处理流程图:
异常处理也就是Spring Mvc中的一个扩展项
Spring HandlerExceptionResolver implementations deal with unexpected exceptions that occur during controller execution【处理在执行处理期间的异常】
根据上面我们的了解,可以简单的了解spring mvc为了我们做处理的基本的处理流程,不够没有经过长期的使用查看过源码的是不能简单的理解这些,下面简单的跟踪一下源码,了解异常处理在spring mvc执行流程中哪个环节??
主要的源码都在DispatcherServlet.class
这些处理的前提HandlerMapping、HandlerAdapter、HandlerExpectionResovler等等这些数据都是已经通过spring的注册空间xml或者JavaConfig已经注册在spring的容器中,在spring容器初始化完成之后,通过实践机制获取到spring容器中注册的这些处理类,然后进行业务逻辑的处理。
1、初始化MVC需要的解决方案扩展
2、通过容器的特性找到需要的HandlerAdater等等、异常的处理也是在这里完成的
3、spring处理请求的分发
通过请求从当前能够处理的HandlerMapping中获取到HandlerExcutionChain
获取当前HandlerMapping 对应的HandlerAdapter的适配器
HandlerExcutionChain 处理执行真正处理之前的过滤器逻辑,然后通过HandlerAdapter执行反射调用、然后处理过滤器处理之后的逻辑
4、processDispatchResult 这里是处理之前请求过程中无论是正常还是异常以后的处理逻辑
异常处理体系就是从这里介入,存在的异常被补获啦,通过变量保存起来,然后判断是走正常的路线还是异常的路线。
如果是有异常就直接走异常处理体系的处理逻辑,处理完成之后,通过ModeAndView进行返回值,接下来就是处理render 啦!我们这里主要是关注异常处理体系。
5、异常处理
从上面的事件机制我们可以知道,在spring启动完成之后,会在DispatchServlet中注册所有的异常HandlerExceptionResolver,异常处理体系都不能解决只有直接抛出异常啦;遍历异常处理体系,找到一个合适的处理方案,这里也是我们关注的重点!从这里入口我们就知道了异常处理体系的整个的解决方案啦!对于其他的spring中的处理并不用太多的关注!但是理解一些还是十分有用的哦!
HandlerExceptionResolver的整体逻辑哦!只要spring体系中存在这些处理类,我们就可以完成简单的逻辑啦,以后慢慢的解析下面的异常处理类的实现细节!
总结
通过上面的整体的了解,大概的知道了spring的整个异常处理体系的实现的简单的逻辑,其实我们自己只可能需要一个通过编码的方式就可以实现啦这样的逻辑,不过太呆板,没有什么友好的扩展性!看看spring的实现你就知道啦!有时候了解实现的原理还是蛮重要的!