SpringBoot -请求处理原理(浅析)

SpringBoot -请求处理原理(浅析)

一、问题提出

我们知道在springBoot的web开发场景中,实际上使用的底层是springMVC的原理。那么当我们通过一个url访问服务器,服务器根据请求找到对应的处理器进行处理。这整个过程是怎么实现的呢?

二、原理分析

我们知道所有的请求到达服务器时,都需要通过dispatcherServlet进行处理。那么在springboot中也同样如此。我们点开dispatcherServlet,并点开其继承树可以发现:
图1 dispatcherServlet继承树
我们发现,其继承了HttpServlet,也就是说,其本质上是一个Servlet,那么一个Servlet就会重写doget,dopost方法来进行请求的处理。我们查看源码可以知道,其直接父类FrameworkServlet重写了doGet和doPost方法,我们以doGet为例子进行展示:
图2 doGet
根据源码上的描述,就是:“会将get请求,委托给processRequest/doService来进行处理”;
所以我们查看processRequest的源码:
图3 processRequest
我们在描述中可以发现:“实际的请求处理是交给doService方法来进行执行的”。我们查看doservice的源码:

图4 doService
这个方法的作用就是公开暴露DispatcherServlet特定的请求属性,并将请求处理委托给doDispatch方法
我们进入到doDispatch方法中:

图5 doDispatch
在该方法的描述中我们可以知道:这个方法就是对于请求处理的实际处理调度方法。并且这个处理程序的过程是先有HandlerMapping来找到合适的请求处理器,然后通过HandlerAdapter找到该处理器中的参数,进行请求参数匹配和结果参数的封装返回。
下面我们对这个方法进行详细的分析:
1、首先 在这个方法中,我们的形参传入的是原生的request和response
2、进行一些参数的定义和初始化操作:
图6 分析1
3、第一个重要的方法:
图7 分析2
4、我们进入getHandler方法中:
图8 getHandler
在这个方法的描述中我们可以知道,其会返回一个请求处理链给当前的请求,或者是如果没有找到合适的处理当前请求的handlerMapping时,会返回null。
现在我们需要了解的就是它是如何实现找到合适的请求处理器来进行处理当前请求的:
开始会获取所有的handlerMappings:
图9

如在RequstMappingHandlerMapping中的mappingRegistry属性中保存了所有的请求路径和对应处理方法的映射:

图10
然后通过一个增强for循环找到所有可以处理当前请求的handlerMapping,找到的方式就是通过当前请求路径和mappingregistry中的已有的路径进行匹配,只要匹配到,就对应找到了相应的Controller层中的方法,如果匹配到多个路径,那么就会此时就会将找到的第一个匹配的该HandlerMapping进行返回。
此时就已经找到合适的HandlerMapping。

5、找到当前请求的合适的handlerAdapter
图11
6、进入getHandlerAdapter方法中:
图12
该方法会为之前找到的handler匹配一个合适的handlerAdpter进行返回,如果没找到则会抛出一个ServletException异常用于提醒报错信息:“No adapter for handler…”

7、找到合适的Adapter之后,会对于报头进行最后的修改
图13

8、进行最终的请求处理程序的执行调用:
图14

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值