spring mvc 源码解析
2022-08-03 09:30:39 0 举报
AI智能生成
spring mvc 源码解析,关注我,后续有更多的源码解析
作者其他创作
大纲/内容
1. 核心类
1. WebMvcAutoConfiguration
1. 默认的 WebMvcConfigurer 实现, WebMvcAutoConfigurationAdapter
1. 扩展点 HttpMessageConverter 消息转换器, 如 fastjson
2. 扩展点 ContentNegotiationConfigurer 内容协商
3. InternalResourceViewResolver 视图解析器,解析 jsp 页面
<font color="#ff0000">4. ContentNegotiatingViewResolver 视图解析的入口类</font>
5. LocaleResolver 国际化支持
6. FormatterRegistry 前端参数转化
7. RequestContextFilter 上下文过滤器
2. 默认的 webmvc 设置, EnableWebMvcConfiguration
<font color="#ff0000">1. RequestMappingHandlerAdapter @RequestMapping 处理器适配器</font>
<font color="#ff0000">2. RequestMappingHandlerMapping @RequestMapping 处理器映射器</font>
3. ResourceHandlerRegistry 静态资源处理器,映射静态的
4. WelcomePageHandlerMapping 首页处理器
<font color="#ff0000">5. mvcValidator 请求参数校验器</font>
6. ExceptionHandlerExceptionResolver 异常处理器
<font color="#ff0000">2. TomcatServletWebServerFactoryCustomizer 容器自定义类,可以修改端口</font>
3. MultipartAutoConfiguration
1. StandardServletMultipartResolver 文件上传
<font color="#ff0000">4. WebMvcProperties mvc 属性配置类</font>
<font color="#ff0000">5. DispatcherServletAutoConfiguration 请求配置类</font>
1. DispatcherServlet
6. ServletWebServerFactoryAutoConfiguration
2. 请求处理过程
<font color="#ff0000">1. DispatcherServlet#doService</font>
1. logRequest(request); 记录请求,必须要设置为 trace
2. includeRequest 请求的支持(可以忽略)
3. 设置 request 的 attribute
<font color="#ff0000">4. doDispatch(request, response);</font>
1. WebAsyncUtils.getAsyncManager(request)
2. checkMultipart(request) 检查是否为 multipart 类型
<font color="#ff0000">3. getHandler(processedRequest) </font>
1. 遍历所有的 <font color="#ff0000">handlerMappings</font>,获取请求对应的 HandlerExecutionChain
HandlerMapping 重要的类
1. RequestMappingHandlerMapping
2. BeanNameUrlHandlerMapping
3. RouterFunctionMapping, 这个是 reactive 的
<font color="#ff0000">4. HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());</font>
1. 遍历所有的 <font color="#ff0000">handlerAdapters</font>, 获取 handle 对应的 handleAdapter
2. HandlerAdapter 重要的类
1. SimpleControllerHandlerAdapter
2. RequestMappingHandlerAdapter
3. HandlerFunction
<font color="#000000">5. mappedHandler.applyPreHandle(processedRequest, response) 执行前置拦截器</font>
<font color="#ff0000">6. mv = ha.handle(processedRequest, response, mappedHandler.getHandler())</font>
1. invokeHandlerMethod(request, response, handlerMethod)
1. WebDataBinderFactory, 处理@InitBinder
2. ModelFactory, 处理@ModelAttribute
<font color="#ff0000">3. ServletInvocableHandlerMethod, 真正处理逻辑的对象</font>
1. 设置 HandlerMethodArgumentResolver 参数解析器
重要类 <font color="#ff0000">RequestResponseBodyMethodProcessor</font>
2. 设置 HandlerMethodReturnValueHandler 返回值处理器
重要类 <font color="#ff0000">RequestResponseBodyMethodProcessor</font>
1. handleReturnValue
1. writeWithMessageConverters
重要类 <font color="#ff0000">ResponseBodyAdvice</font>
4. ModelAndViewContainer 包装 ModelAndView
<font color="#ff0000">5. invocableMethod.invokeAndHandle(webRequest, mavContainer)</font>
1. invokeForRequest(webRequest, mavContainer, providedArgs)
2. 如果 mavContainer.setRequestHandled(true) 表示 modelAndView 不用处理了
3. this.returnValueHandlers.handleReturnValue()
6. getModelAndView(mavContainer, modelFactory, webRequest)
2. 缓存的处理
7. mappedHandler.applyPostHandle(processedRequest, response, mv) 执行后置拦截器
8. triggerAfterCompletion(processedRequest, response, mappedHandler, ex) 请求完成拦截器
如果处理发生异常,会执行 <font color="#ff0000">processDispatchResult </font>来处理异常
1. exception 是否为 ModelAndViewDefiningException, 取出 modelAndView 对象
2. processHandlerException 执行异常处理
1. 遍历所有的 handlerExceptionResolvers,调用 <font color="#ff0000">resolver.resolveException</font> 方法返回 modelAndView 对象
重要的 HandlerExceptionResolver: <font color="#ff0000">ExceptionHandlerExceptionResolver</font>
2. 没有 modelAndView, 执行 <font color="#ff0000">getDefaultViewName(request)</font> 获取默认的view
3. render(mv, request, response)
3. 实例代码
0 条评论
下一页