SpringMvc启动流程及调用流程
2023-04-10 23:12:05 0 举报
SpringMvc启动流程及调用流程
作者其他创作
大纲/内容
Handler @RequesMapping的方法 Controller类型的Bean对象(/name) HttpRequestHandler类型的Bean对象(/name) RouterFunction类型的Bean对象
SimpleControllerHandlerAdapter支持的Handler类型为Controller
有@ResponseBody RequestResponseBodyMethodProcessor
RequestMappingHandlerAdapter
AbstractHandlerMethodMapping.register
没有@ResponseBody 返回类型为CharSequence<String的父类>ViewNameMethodReturnValueHandler
创建spring容器
获取DispatcherServlet.properties中配置的HandlerMapping类名
modelandview不为空
否
detectHandlerMethods
RequestMappingHandlerAdapter支持的Handler类型为HandlerMethod
processDispatchResult渲染视图
HttpRequestHandlerAdapter
若当前request为StandardMultipartHttpServletRequest直接从前面的multipartFile中拿到part赋值给参数
ServletInvocableHandlerMethod.invokeAndHandle调用方法
checkMultipart(与文件上传有关)
HandlerFunctionAdapter
InvocableHandlerMethod.invokeForRequest
举个例子
执行拦截器preHandle方法
DispatcherServlet.doService
DispatcherServlet.init
返回StandardMultipartHttpServletRequest作为后面调用适配器handle方法的request入参
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
循环当前类中所有方法getMappingForMethod
FreeMarkerViewResolver则会进行渲染,然后将渲染结果返回给浏览器
StringHttpMessageConverter能把String对象直接响应给浏览器
调用返回值处理器的handleReturnValue方法
遍历类名去创建HandlerMapping的Bean对象
创建参数解析器argumentResolvers
遍历返回值处理器,调用返回值处理器returnValueHandlers匹配处理器
view.render
调用参数解析器的resolveArgument进行参数解析
AbstractDetectingUrlHandlerMapping.detectHandlers
创建返回值处理器returnValueHandlers
returnValueHandlers.handleReturnValue处理返回值
遍历HandlerMapping来匹配请求path对应的Handler
getModelAndView(返回ModelAndView 若mavContainer.setRequestHandled(true)返回rull)
执行拦截器afterCompletion
initHandlerAdapters
判断类上是否有Controller或RequestMapping注解
pathLookup和registry可以构成path->Method的关系
调用匹配的适配器的handle方法
getDefaultStrategies(一般都使用默认的HandlerMapping所以进这个逻辑)
拿到font color=\"#323232\
解析参数
AbstractHandlerMethodAdapter.handle
RequestMappingHandlerMapping.afterPropertiesSet
若不是直接request.getParameterValues,拿到值赋给参数
若接收的是User对象,直接在User类中创建有参构造方法,或者创建一个类型转化器使用InitBinder注册
BeanNameUrlIHandlerMapping会去handlerMap找,找到的是bean对象 RequestMappingHandlerMapping会去pathLookup找,找到的是HandlerMethod
RouterFunctionMapping先不做分析
initHandlerMappings
,遍历视图解析器获取视图(View),获取到(View)视图直接退出循环
解析web.xml
直接执行handleRequest方法
遍历容器所有beanname
ViewNameMethodReturnValueHandler会把返回的String设置给ModelAndViewrequestHandled=false
它会对请求进行转发,转发到指定的jsp文件路径,Tomcat处理完jsp文件后将页面返回给浏览器
把非文件part的参数名存入Set<String> multipartParameterNames
请求调用
根据beanname找到Class对象
获取所有的参数解析器,然后筛选出合适的解析器,使用参数解析器的supportsParameter进行选择
有个小坑只有RequestMapping注解也不行,因为没@Compoment不是一个bean
SimpleControllerHandlerAdapter
创建数据绑定器initBinderArgumentResolvers
获取目标方法入参的值
获取目标方法入参的值,并调用方法
根据请求path找Handler
RequestMappingHandlerAdapter.handleInternal
HttpRequestHandlerAdapter支持的Handler类型为HttpRequestHandler
doDispatch
mavContainer.setRequestHandled(true);
ContextRefreshListener.onApplicationEvent
默认的视图解析器为InternalResourceViewResolverFreeMarker的视图解析器围殴FreeMarkerViewResolver
逻辑类似于initHandlerMappings
tomcat的adapter会通过piple-valve管道模式调用容器的service方法,依次调用engine、host、context、servlet容器的service方法
创建DispatcherServlet对象
若是,调用StandardServletMultipartResolver.resolveMultipart
执行拦截器postHandle
MappingJackson2HttpMessageConverter能把User对象、Map对象转成JSON字符串响应给浏览器
遍历methods
BeanNameUrlHandlerMapping的祖先类实现了ApplicationContextAware
bean初始化调用afterPropertiesSet
initViewResolvers
initHandlerMethods
bean创建过程中调用setApplicationContext
是
根据请求得contentype判断是否以multipart开头
从请求中获取所有part
根据handler找到对应的适配器,遍历适配器,调用适配器的supports即可完成匹配
<load-on-startup>1</load-on-startup> 为1启动创建 为0请求来了创建
DispatcherServlet.onRefresh
DispatcherServlet.service
tomcat启动
根据请求要求的Accept响应格式,找适合的HttpMessageConverter
0 条评论
下一页