springMVC源码
springMVC
执行流程
请求进入SpringMVC会执行DispatchServlet的doDispatch方法。
HandlerMappings
handlerMappings是一个List
RequestMappingHandlerMapping负责搜索项目中采用RequestMapping来注解的方法,这也是现在spring中定义请求的最主要的方式。
RequestMappingHandlerMapping中有MappingRegistry的成员变量,它维护这两个重要的map
MultiValueMap<String, T> urlLookup
Map<T, HandlerMethod> mappingLookup
通过这两个map最后拿到执行的方法。
HandlerAdapter
拿到了需要执行的方法,springMVC下一步要做的是确定这个方法的调用方式。
HandlerAdapter最重要的实现类是RequestMappingHandlerAdapter,也是因为因为现在所有的请求方法都是采用的RequestMapping。
但是为了兼容以前定义Controller的代码,比如实现Controller接口这种方式。
通过这一步,确定了方式的执行方式。
HandlerMethodArgumentResolver
因为整个SpringMVC中,是通过反射的方式来执行RequestMapping注解标记的方式。
这一步是获取方法里的参数值。
比如@RequestBody或是@PathVariable等注解标记的参数
HandlerMethodArgumentResolver是一个接口,有众多实现类,包括,PathVariableMethodArgumentResolver处理PathVariable注解,RequestParamArgumentResolver处理RequestParam注解,RequestResponseBodyMethodProcessor处理@RequestBody注解。
反射执行
通过HandlerMethodArgumentResolver获取到参数以后,通过反射执行方法。
HandlerMethodReturnValueHandler
方法执行后通过HandlerMethodReturnValueHandler返回,因为现在最常用的是前后端分离,所有其中最常用的是RequestResponseBodyMethodProcessor。
RequestResponseBodyMethodProcessor类同时实现了HandlerMethodReturnValueHandler和HandlerMethodArgumentResolver接口
RequestResponseBodyMethodProcessor
RequestResponseBodyMethodProcessor由包含多个MessageConverter,用于处理不同的类和不同的MediaType。
其中最常用的是处理MediaType为json的MappingJackson2HttpMessageConverter