SpringBoot 請(qǐng)求映射原理
url = localhost:8080/user?username=zhangsan&age=18
眾所周知 springboot 默認(rèn)是 tomcat 容器 (SERVLET web類型)。我們要分析一個(gè)請(qǐng)求過(guò)來(lái)所經(jīng)歷的過(guò)程,自然要從前端總控制器(DispatchServlet)開始說(shuō)起。按照 Servlet 規(guī)范,所有請(qǐng)求都會(huì)被tomcat容器交到 dispatchServlet 的 doService 方法中去處理。跟到這個(gè)方法中去,我們發(fā)現(xiàn)其中設(shè)置了變量進(jìn) request 對(duì)象,然后執(zhí)行了 doDispatch 方法,這個(gè)方法才是真正實(shí)現(xiàn)請(qǐng)求處理的核心。
DispatchServlet.java
protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception {
this.logRequest(request);
try {
this.doDispatch(request, response);
} finally {
}
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
boolean multipartRequestParsed = false;
WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
try {
try {
ModelAndView mv = null;
Object dispatchException = null;
try {
//檢測(cè)是不是文件上傳
processedRequest = this.checkMultipart(request);
//如果是文件上傳,置標(biāo)志位
multipartRequestParsed = processedRequest != request;
//使用getHandler 來(lái)進(jìn)行匹配 //本節(jié)重要
/*
在這里debug可以找到對(duì)應(yīng)的 關(guān)系
RequestHandlerMapping
-> mappingregistry
->registry
->RequestMappingInfo 這個(gè)里面對(duì)應(yīng)的 關(guān)系 例如"POST/ user" 方法
*/
mappedHandler = this.getHandler(processedRequest); //此處就具體找到了對(duì)應(yīng)的 那個(gè)controller和那個(gè)方法
....
}
@Nullable
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
// 通過(guò)容器找到所有的handlerMapping
/*
RequestMappingHandlerMapping //這里就是我們需要分析的HandlerMapping
SimpleUrl
BeanName
...
WelecomPageHandler //這里就是處理 歡迎頁(yè)的 handlerMapping
*/
if (this.handlerMappings != null) {
Iterator var2 = this.handlerMappings.iterator();
while(var2.hasNext()) {
HandlerMapping mapping = (HandlerMapping)var2.next();
//此處進(jìn)行匹配 將匹配的就是(Controller的具體方法)
HandlerExecutionChain handler = mapping.getHandler(request);
if (handler != null) {
return handler; //封裝為handler 返回
}
}
}
return null;
}
到此,已經(jīng)可以找到 具體的請(qǐng)求映射了
下面分析 參數(shù)的封裝原理
springboot 參數(shù)封裝原理 - 簡(jiǎn)書 (jianshu.com)