springboot源码学习(请求映射原理)

请求所使用的类:DispatcherServlet

继承树


以用户get请求为例:当用户请求的时候,进入DispatcherServlet,通过继承树的分析,可以得到他是继承HttpServlet,因此就会重写doGet方法,通过查询得到,FrameworkServlet中有重写doGET方法

从doGet方法中看到,执行了processRequest(request, response)方法,其中核心部分是doService方法

由于,FrameworkServlet中只定义了他为一个抽象方法,因此DispatcherServlet中对该方法进行了重写

其中核心方法是:doDispatch(request, response);

进入到doDispatch(request, response)方法中。其中mappedHandler = getHandler(processedRequest);为核心

在断点中可以看到,其中有5个handlerMapping,这些handlerMapping都是在项目其中的时候,自动注入到容器中,其中requestMappingHandlerMapping代表的就是,只用注解requestMapping()的那些方法,都会放在这个集合里面,另外加上系统自带的error方法

在getHandler(processedRequest)方法中,遍历循环5个mapping,然后将用户请求的request分别和他们匹配,若是匹配上了,则放回,并且执行该匹配上的方法,进行下一步执行。

匹配详解

进入到HandlerExecutionChain handler = mapping.getHandler(request)中,

第一个先进入,requestMappingHandlerMapping中,



首先获取请求的url,然后在执行lookupHandlerMethod(lookupPath, request),进行去匹配

从图中可以看到,uri 是/user 

这边自己测试写的注解注解种,其中user的有四个,分别为post,get,put,delete,这边通过

/user去匹配,最后匹配到了四个,

接下去做下一步判断,若是存在则执行addMatchingMappings(directPathMatches, matches, request);方法。

图中可以看到,其中directPathMatches 则为/user匹配得到的一个arrayList,matches则为空List,以及用户请求的request参数

通过代码分析,可以得到,for循环,directPathMatches,然后获取到每一个mapping中的请求方式如(get,post,put,delete)进行和request.getMethod()进行匹配,若是匹配上了,则添加到matches列表中,否则继续循环,若是requestMappingHandlerMapping中没有匹配到,则继续循环下一个handlerMapping,然后继续在handlerMapping进行进一步的匹配。

最后,若是匹配到了,就执行找到的方法。

你可能感兴趣的:(springboot源码学习(请求映射原理))