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 页面
4. ContentNegotiatingViewResolver 视图解析的入口类
5. LocaleResolver 国际化支持
6. FormatterRegistry 前端参数转化
7. RequestContextFilter 上下文过滤器
2. 默认的 webmvc 设置, EnableWebMvcConfiguration
1. RequestMappingHandlerAdapter @RequestMapping 处理器适配器
2. RequestMappingHandlerMapping @RequestMapping 处理器映射器
3. ResourceHandlerRegistry 静态资源处理器,映射静态的
4. WelcomePageHandlerMapping 首页处理器
5. mvcValidator 请求参数校验器
6. ExceptionHandlerExceptionResolver 异常处理器
2. TomcatServletWebServerFactoryCustomizer 容器自定义类,可以修改端口
3. MultipartAutoConfiguration
1. StandardServletMultipartResolver 文件上传
4. WebMvcProperties mvc 属性配置类
5. DispatcherServletAutoConfiguration 请求配置类
1. DispatcherServlet
6. ServletWebServerFactoryAutoConfiguration
2. 请求处理过程
1. DispatcherServlet#doService
1. logRequest(request); 记录请求,必须要设置为 trace
2. includeRequest 请求的支持(可以忽略)
3. 设置 request 的 attribute
4. doDispatch(request, response);
1. WebAsyncUtils.getAsyncManager(request)
2. checkMultipart(request) 检查是否为 multipart 类型
3. getHandler(processedRequest)
1. 遍历所有的 handlerMappings,获取请求对应的 HandlerExecutionChain
HandlerMapping 重要的类
1. RequestMappingHandlerMapping
2. BeanNameUrlHandlerMapping
3. RouterFunctionMapping, 这个是 reactive 的
4. HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
1. 遍历所有的 handlerAdapters, 获取 handle 对应的 handleAdapter
2. HandlerAdapter 重要的类
1. SimpleControllerHandlerAdapter
2. RequestMappingHandlerAdapter
3. HandlerFunction
5. mappedHandler.applyPreHandle(processedRequest, response) 执行前置拦截器
6. mv = ha.handle(processedRequest, response, mappedHandler.getHandler())
1. invokeHandlerMethod(request, response, handlerMethod)
1. WebDataBinderFactory, 处理@InitBinder
2. ModelFactory, 处理@ModelAttribute
3. ServletInvocableHandlerMethod, 真正处理逻辑的对象
1. 设置 HandlerMethodArgumentResolver 参数解析器
重要类 RequestResponseBodyMethodProcessor
2. 设置 HandlerMethodReturnValueHandler 返回值处理器
重要类 RequestResponseBodyMethodProcessor
1. handleReturnValue
1. writeWithMessageConverters
重要类 ResponseBodyAdvice
4. ModelAndViewContainer 包装 ModelAndView
5. invocableMethod.invokeAndHandle(webRequest, mavContainer)
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) 请求完成拦截器
如果处理发生异常,会执行 processDispatchResult 来处理异常
1. exception 是否为 ModelAndViewDefiningException, 取出 modelAndView 对象
2. processHandlerException 执行异常处理
1. 遍历所有的 handlerExceptionResolvers,调用 resolver.resolveException 方法返回 modelAndView 对象
重要的 HandlerExceptionResolver: ExceptionHandlerExceptionResolver
2. 没有 modelAndView, 执行 getDefaultViewName(request) 获取默认的view
3. render(mv, request, response)
3. 实例代码
0 条评论
下一页