Spring 异常处理器 源码分析总结

来源:互联网 发布:阿里卖家版是什么软件 编辑:程序博客网 时间:2024/06/16 10:20

异常处理的作用

可以拦截制定异常,并进行处理返回到制定页面。

需求举例

如我的需求当用户请求不存的页面时不能出现浏览器默认的404页面,而出现我自己定义的html也面。当出现A类异常时返回到a.html。出现B类异常返回带b.html。

项目实例

例如:当为我根本没有ind123ex.html服务请求时。
如果我不自定义错误处理器。返回404页面

当自定义错误处理器,处理NoHandlerFoundException(404的异常)异常后返回制定的请求页面。当然你也可以拦截自定义的异常,返回到不同的页面。


以下部分对Spring异常处理器执行和加载源码进行分析

1、DispatcherServlet这个前端配置器中初始化的策略对象如下图

2、initHandlerExceptionResolvers为初始化异常处理类。

可以看到初始化异常处理集合是通过类型从上下文获取。并且通过sort对异常处理器集合排序。

排序的作用: 当发生异常时,根据异常处理器的顺序来处理异常,当有异常处理其能够处理当前异常信息时,就不再执行后面的异常处理器了。


3、异常处理信息排序  根据对象的 Order属性进行排序,如果不是Order对象类那么排序就靠后。




4、执行异常处理,可以看到当发生异常时候,按顺序执行异常处理器(this.handlerExceptionResolvers)。当有异常处理器能够处理当前一场(exMv != null)。则后面的异常处理器都不会执行。



5、默认异常顺序设置:


源代码在org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser
类注释说明


可以看到<annotation-driven/> 自动加载的异常处理 ,默认加载三个分别是(ExceptionHandlerExceptionResolver、ResponseStatusExceptionResolver、DefaultHandlerExceptionResolver)。

6、加载源代码分析。

       在org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser 类中有分别加载上面三个异常处理器的代码如下。

①、ExceptionHandlerExceptionResolver


②、ResponseStatusExceptionResolver


③、DefaultHandlerExceptionResolver

可以看到三个异常加载器的Order分别为(0,1,2)。

6、自定义异常处理器

(继承AbstractHandlerExceptionResolver【可设置顺序】或者HandlerExceptionResolver【不能设置顺序】)以及设置异常处理类的执行顺序

7、如果考虑自定异常处理器比默认异常处理器的优先级高。那么一定要考虑设置 Order。

如果有什么错误的地方, 欢迎大家多多指正。
1 0
原创粉丝点击