SpringBoot知识点及其源码解析(3)
目录
源码解析
请求参数解析原理
获取处理器适配器
开始适配处理
源码解析
@RestController
public class ParamController {
@RequestMapping("user/{userId}/num/{num}")
public @ResponseBody String testParam(@PathVariable("userId") String userId,
@PathVariable("num") Integer num) {
return "userId: " + userId + ", num: " + num;
}
}
为什么这样去写,springboot就能把前台的参数接收
请求参数解析原理
获取处理器适配器
回到DispatcherServlet.class的doDispatch方法,它是专门拦截用户请求的,其中this.getHandler是通过处理器映射器帮助进行请求处理,返回一个mapperHandler,具体原理讲解,这里不在细讲。
这个mapperHandler被HandlerExecutionChain进行一层包装,然后交给处理器适配器进行进一步的处理。本方法(doDispatch)的HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());就是来进行获取处理器适配器的。来看下这个方法(图解)
为什么实现了HandlerAdapter接口就可以了呢?继续看下图:
总结:获取处理器适配器ha成功
开始适配处理
对handle进行处理,返回值是ModelAndView
handleInternal内部调用invokeHandlerMethod方法,有三个参数,请求,相应以及处理方法。
在invokeHandlerMethod方法中,首先是获取参数解析器课返回值处理器,然后在进行处理。
开始进行处理
进入invokeAndHandle方法,
这里是PathVariable是因为代码中使用的@PathVariable注解
resolveArgument执行完毕,返回arg数组
总结:首先获取handler,获取后需要处理器和解析器进行处理,获取处理器和适配器成功后调用handle放进行处理,里面拿到参数解析器和返回值处理器,进行循环27个参数解析器,获取最适合解析的参数解析器,看参数是否存在某个注解,其中的@PathVariable是将参数放到map集合中,key是参数名称,通过key寻找value参数值。