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 条评论
 下一页