SpringMvc-Dispatcher

来源:互联网 发布:淘宝a0图纸扫描仪 编辑:程序博客网 时间:2024/05/22 16:53

虽然知道springMvc处理请求的大致过程,但是具体实现在脑子里比较模糊,因此简单看下源码,只求看懂工作原理,并做下笔记。

几个关键类或接口的说明:

HandlerMapping:

这是一个接口,该接口表示实现了这个接口的类是完成url和处理bean映射逻辑的。当SpringMvc启动就会根据选择的实现类去把Controller类型的bean和url绑定如果我们不在配置文件配置,默认会用BeanNameUrlHandlerMapping 这个实现类去完成这个工作(实现类种类如图1)。在registerHandler(String urlPathObject handler)这个方法中把urlPath当做bean的Name,从ApplicationContext中拿到bean的实例,然后放入urlPath为key,value为该实例的map中(图2)。

图1:HandlerMapping的实现类


图2:registerHandler。


HandlerAdapter

由于springMVC创建的handle的种类有很多种,不同的handler处理请求的方法不同(如图3)。这里就用了适配器模式。因为如果把handler类型的判断放到请求的处理中不符合规范代码的要求,也使处理请求的代码不够简练,总而言之,处理请求就是处理请求,不应该有其他逻辑。具体的适配方式是,HandlerAdapter接口有一个supports(Object handle)方法,该方法判断该当前的适配器是否支持这种handle。

图3:handle有几种adpter就有几种。


HandlerExecutionChain

该类持有一个Object Handle的对象,和一个拦截器的集合。当请求进来,doDispatcher方法会遍历所有的HandlerMapper从中找到和request匹配的hander,把这个hander放入HandlerExecutionChain中。

doDispatcherServlet

doDispatcherServlet中的doService首先拿到请求,对request注入一些属性然后调用doDispatch。这个方法首先判断request是否是Multipart类型(处理文件上传下载)如果是会构建processRequest时传入multipartResolver。然后根据request中的url,从handleMapper中找到对应hander并且放入handlerExecutionChain对象中。然后根据handlerExecutionChain中的hander找到对应的适配器HandlerAdapter。然后调用handlerExecutionChain的applyPreHandle();方法执行handlerExecutionChain中前置拦截器的逻辑。然后执行HandlerAdapter.handle()方法执行我们在controller中写的逻辑。

                                             
0 0
原创粉丝点击