spring的mvc容器创建过程和doDispatch处理请求的流程
2022-10-07 14:03:26 17 举报
spring的mvc容器创建过程和doDispatch处理请求的流程
作者其他创作
大纲/内容
initRequestToViewNameTranslator初始化视图预处理器
afterPropertiesSet
AbstractHandlerMapping#getHandler
添加ContextRefreshListener监听器
是否是patch请求或者是否是null
属于servlet容器,启动时会执行init初始方法,在父类中HttpServletBean
ApplicationObjectSupport#initApplicationContext()
RouterFunctionMapping
bean实现带有注解@Controller或者@RequestMapping
FrameworkServlet中service方法处理servlet
AbstractHandlerMethodMapping#initHandlerMethods
抛出异常
RequestAttributes
处理 @initBinder 参数解析器
执行拦截链上所有的preHandle
initWebApplicationContext
9大组件初始化实例化过程中,如果有默认值。会直接从DispatcherServlet.properties配置文件中进行加载,如果没有默认值那么就直接置空
获取默认的解析器
注册到mappingRegistry
refresh()
否
processRequest
tomcat容器读取web.xml
RequestMappingHandlerMapping
是
解析请求获取属性对象
查找当前处理中所有包含@ModelAttribute注解修饰的方法 查找@ControllerAdvice注解修饰类中@ModelAttribute方法
initMultipartResolver多文件上传组件
省略若干部分
doDispatch处理请求的流程
setApplicationContext
查找当前处理中所有包含@InitBinder注解修饰的方法 查找@ControllerAdvice注解修饰类中@InitBinder方法
AbstractHandlerMethodMapping
spring的mvc容器创建过程和9大组件实例化初始化过程
render视图渲染
RequestMappingHandlerAdapter
ExceptionHandlerExceptionResolver
initHandlerAdapters初始化参数适配器
向request中设置某些属性值
请求参数处理,通过26个参数处理器来进行处理,哪个参数能够匹配上就用哪一个
进行处理器的调用,实际逻辑处理
所有的 @ControllerAdvice 注解,处理@ModelAttribute、 @InitBinder
根据不同的配置方式来选择合理的方式创建springmvc容器
渲染逻辑
处理返回参数处理器
initStrategies初始化MVC的九大组件
publishEvent调用DispatcherServlet#onRefresh
WebAsyncManager
BeanNameUrlHandlerMapping
handleReturnValue
configureAndRefreshWebApplicationContext
doDispatch
设置environment、parent和contextConfigLocation
initControllerAdviceCache
invocableMethod.invokeAndHandle
获取RequestMappingInfo
checkMultipart检查是否是文件上传的请求
createWebApplicationContext
该类实现InitializingBean
initHandlerExceptionResolvers初始化异常拦截器
getModelAndView
向invocableMethod中设置基本的属性值:参数处理器,返回值处理器。@InitBinder修饰的方法,参数名称发现器
LocaleContext
不同的initHandlerMappings会有不同的实现类,依据返回的结果是否为空,判断是否循环下一个initHandlerMappings
initThemeResolver初始化模板处理器
HttpServlet#service
要根据不同的处理器类型来选择合适的适配器才能执行。如果是实现Controller或者HttpRequestHandler接口,那么直接调用handleRequest方法即可,如果同@Controller的方式的话,无法确定要调用的方法是哪一个,必须通过适配器的方式来进行具体的方法调用
异步处理请求处理工作获取到异步处理器并设置属性,判断是否是异步处理的请求
initHandlerMappings初始化handlerMapping
记录请求开始时间
getHandlerAdapter 获取处理器适配器
processDispatchResult处理返回结果
DefaultHandlerExceptionResolver
待补充
ContextLoader#static读取ContextLoader.properties
ResponseStatusExceptionResolver
创建spring容器
返回结果处理,通过15个返回值处理器来进行处理
HttpRequestHandlerAdapter
doService
initFrameworkServlet
创建ServletInvocableHandlerMethod
设置servletConfig、servletContext
doInvoke
initLocaleResolver初始化本地语言环境
getHandler返回包装的handler和拦截器链对象
getMethodArgumentValues
父类AbstractHandlerMethodMapping实现InitializingBean
handle实际处理器的请求
initFlashMapManager初始化视图处理器
遍历handlerMappings,解析请求去寻找handler
Spring的IOC容器
判断mappedHandler是否为空
父类ApplicationObjectSupport实现ApplicationContextAware
ContextLoaderListener
请求执行前的准备工作
创建WebApplicationContext
AbstractUrlHandlerMapping
跟processedRequest比较
包装成执行链,HandlerExecutionChain添加可以到达的拦截器,没有404
判断是否包含root属性
属性对象封装到request中
getHandlerInternal
SimpleMappingExceptionResolver
initViewResolvers初始化视图转化器
initServletBean
判断context是否为空
SimpleControllerHandlerAdapter
判断请求是否是Head类型并且获取last_modified的值
执行拦截链上所有的postHandle
将request和response封装到一个具体的对象中ServletWebRequest
获取root容器
创建ModelAndViewContainer容器,存储Modal和View对象并向ModelAndViewContainer中设置某些属性
加载contextConfigLocation的spring配置文件
handleInternal
HandlerFunctionAdapter
invokeHandlerMethod
invokeForRequest
遍历handlerAdapter,解析请求去寻找handlerAdapter
ha.handle
正常结束或者异常都会调用拦截器AfterCompletion
0 条评论
回复 删除
下一页