共计 1721 个字符,预计需要花费 5 分钟才能阅读完成。
1.SpringMVC 的执行流程
2.SpringBoot 申请参数解析原理
1.SpringMVC 的执行流程
上一篇博客 SpringBoot 申请映射原理,咱们讲过 SpringMVC 的执行流程,为了便于学习,每次在这一系列的博客开始前,我都会附上上面这张图。
2.SpringBoot 申请参数解析原理
通过上篇博客的学习,咱们曾经晓得了 SpringBoot 是如何 通过申请门路找到对应的执行 handler的,那么这篇博客,咱们将学习 springBoot 是如何将 申请参数和 handler 的参数一一对应并执行指标办法 的过程。
先说一句话概括论断:SpringBoot 通过不同的注解,读取对应的参数并封装。
咱们在应用 springBoot 的时候,常常会在 Controller 办法上写上以下注解:
@PathVariable
@RequestParam
@RequestBody
...// 等等类似的若干注解
咱们以上面的 controller 办法为例,察看参数是如何封装的:
@GetMapping("/test/{id}")
public String test1(@PathVariable String id,
@RequestParam String age)
{System.out.println(id);
System.out.println(age);
return "ok!";
}
咱们仍旧在 DispatcherServlet 的doDispatch办法上打上断点,打在上面这一行:
往里继续执行,咱们会发现一行重要的代码,看函数名字就能够通晓,这是执行 handler 的代码:
持续往里执行,咱们会 看到很多类的初始化 ,(可不必具体浏览,抓住主流程即可),不过得记住一个重要的参数, 参数解析器,等等会用来解析参数,咱们在图上曾经标出:
继续执行,咱们会发现一个重要办法 invokeAndHandle:
咱们持续往里看:
能够得出,下面一行依据申请调用了 handler 的办法,并且返回了一个参数,看来间隔咱们要找的代码越来越近了,咱们持续往里点击。
依据名字能够得出,咱们当初获取了所有参数 args,并依据申请参数调用指标 handler,咱们看看 getMethodArgumentValues()办法是如何获取参数的,这就是咱们明天要阐明的重点:
咱们能够看到 进行了如下三个步骤 :
1.springBoot 先获取了 handler 上的所有形式参数
2. 查看 handler 上的参数是否反对解析
3. 若反对解析,则应用参数解析器进行解析。
this.resolvers.resolveArgument(parameter, mavContainer, request, this.dataBinderFactory);
接下来咱们进入 suopport 办法,咱们 handler 的第一个参数应用的是 @PathVariable 注解 标注:
进入这个办法后,会遍历所有的参数解析器 ,找到 反对以后参数的解析器 ,能够看到PathVariableMethodArgumentResolver 很可能就是咱们想到的,咱们循环到这个值,并进入办法 supportsParameter:
能够看出办法很简略,就是查看这个参数是否标注了 PathVariable.class 注解,这里咱们返回 true。(其它的参数解析也是同样的形式,能够自行 debug)
参数解析器咱们曾经失去了,接下来咱们看看解析参数的流程:
这里的逻辑也非常简略,大略分成了以下三步:
1. 取得 handler 参数名字
2. 依据参数名字从 request 里拿到参数
3. 将这两个参数绑定在一起
其中,参数绑定器 WebDataBinder 中,有 124 个 conversionService,名为 参数转换器服务,能够将request 中的字符串参数转换成以后 handler 参数须要的参数,如日期,整数,字符串等等。
通过这一系列的参数解析,咱们就将 handler 参数和申请参数一一对应了起来。
最初应用反射调用 handler 的办法。
总结:
1.springBoot 里有对应的参数解析器,用来解析 Controller 上用注解标注的不同参数。
2.springBoot 里有若干的参数转换器,用来将申请参数转换成实体类的参数类型。