SpringMvc-Dispatcher

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

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处理请求的方法名称和传入类型都不同。为了扩展性好,和代码简练。这里就用了适配器模式。适配器把处理方法统一用方法handle(HttpServletRequest request, HttpServletResponse response, Object handler)处理,就不用把handler类型的判断放到请求的处理中然后根据不同类型的去调用不同的方法。不符合规范代码的要求,也使处理请求的代码不够简练,如果有新加入的handle只要实现handlerAdapter接口就可以加入一种新的处理方式了不需要侵入dispatcherServlet。总而言之,处理请求就是处理请求,不应该有其他逻辑。具体的适配方式是,HandlerAdapter接口有一个supports(Object handle)方法,该方法判断该当前的适配器是否支持这种handle。

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


HandlerExecutionChain

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

DispatcherServlet

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

 
 
 

                
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值