不一样的springMVC请求处理逻辑的理解(二)

在上一篇中说了对DispatherServlet的理解,还差一个最重要的没说,就是springMVC 对请求的处理过程。

spring-webmvc对请求的处理过程

之所以先说了DispatherServlet,是因为必须要了解它的本质是什么,才能了解它怎么起的作用,一般我们都说DispathcerServlet是一个调度器,从它的名字我们就可以发现它其实就是一个servlet,所以它才可以成为接收web请求的入口,进而进行调度。

在调度的过程中:

首先通过doService方法来接收请求,在请求中设置环境上下文,以及web相关的配置,比如主题、国际化等信息。

第二,就到了我们的核心doDispather方法,在该方法,最先通过request对象获取HandlerExecutionChain的对象,如下图,可以看到在HandlerExeutionChain中不仅包含了handler本身,也包括对于这个handler的所有的拦截器,一个handler可以有多个拦截器,最终由一个handler和0个或者多个拦截器组成了一个处理请求的链条。

第三,在上面的步骤中,是怎么获取到HandlerExecutionChain对象的呢?答案如下图,是通过遍历所有HandlerMapping,然后由HandlerMapping的getHandler方法返回一个HandlerExecutionChain对象。

第四,有了HandlerExecutionChain对象后,我们其实已经获取到了handler,但是spring在这里又通过getHandlerAdapter遍历所有的HandlerAdapter,找到一个和这个handler想匹配的HandlerAdapter。

 

最后,通过调用HandlerAdapter的handle方法,来处理请求,在这个方法中,其实也是通过调用HandlerExecutionChain对象中的handler的方法来实现对请求的处理。

思考点

哦噗,处理一个请求好复杂啊,搞了这么多层,倒了这么多的手,究竟是为啥呢?我想:

第一,为了上层的灵活性,之所以弄了一个HandlerAdapter,就是为了使真正处理请求的Handler可以是任何的javaBean,大家可以在源码里看到,handler是一个Object对象,所以在使用spring的DispacherServlet调度器中,不只是能调度Controller、Servlet,理论上可以调度任何类型。

第二,为了使设计更加符合单一职责的原则,例如HandlerMapping只负责请求和handler的对应关系,HandlerAdapter负责执行Handler,HandlerExecutionChain负责加入拦截器,职责非常的明确。

第三,大家想想吧,想好了告诉我,多谢!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值