在上一章解釋到钧栖,用戶請求一個url地址低零,springboot通過注解的方式,最終通過在項目啟動時候拯杠,注入的handlerMapping中找到了控制器并且找到了需要執(zhí)行的方法掏婶。接下來就是需要解析的是,用戶請求攜帶的參數(shù)潭陪,是如何得到并且處理的雄妥。
如圖中所示:這邊使用了@PathVariable和@RequestHeader注解來獲取,用戶請求的id以及請求頭信息依溯。
上節(jié)中說到老厌,最后獲取到了mappedHandler,那么接下來就是獲取參數(shù)黎炉,并且進行處理梅桩。
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());(為mappedHandler找到對應(yīng)的適配器)
進入?getHandlerAdapter(mappedHandler.getHandler())中可以看到有四個HandlerAdapter:
然后進行遍歷循環(huán)這四個HandlerAdapter進行和mappedHandler適配,進入到
t通過代碼可以發(fā)現(xiàn)拜隧,當(dāng)前的handler是屬于HandlerMehtod,并且支持Internal,因此返回true,其實RequestMappingHandler的作用就是支持方法上標(biāo)注的@RequestMapping .
接下來這一步就是執(zhí)行目標(biāo)方法宿百,
圖中可以看到趁仙,一共有27種,這個也說明了垦页,我們的方法中可以執(zhí)行27種參數(shù) 其中包括@PathVariable雀费,@RequestHeader等
將參數(shù)解析器和返回值處理器全都放入到invocableMethod中。
進入到核心部分痊焊,通過invocableMethod的invokeAndHandle方法執(zhí)行并且處理盏袄。
進入到invokeForRequest中
在進入到getMethodArgumentValues(獲取所有參數(shù)方法的值)
從圖中可以看到,一共有兩個參數(shù)薄啥,因此就設(shè)置一個空數(shù)組辕羽,長度為2,然后進行遍歷循環(huán)parameter
this.resolvers.supportsParameter(parameter)用來判斷當(dāng)前的解析器是否支持當(dāng)前的參數(shù)類型垄惧。
由于第一個參數(shù)是PathVariable類型刁愿,Iterator var3 =this.argumentResolvers.iterator(); 獲取當(dāng)前的27個解析器,并且遍歷到逊,判斷是否支持PathVariable類型铣口,若是有匹配到,則放入this.argumentResolverCache中觉壶,并且返回結(jié)果脑题,以便于下次請求時,直接通過this.argumentResolverCache.get(parameter);去獲取铜靶,不用在重新獲取當(dāng)前的所有解析器了
獲取到以后叔遂,返回。
然后在進入改方法
通過request.getAttribute獲取請求的參數(shù)争剿,得到id=12已艰,同理第二個參數(shù)也是一樣的規(guī)則。最后得到
最后獲取到了參數(shù)秒梅,以及參數(shù)的值