SpringMVC流程简述

详细的代码执行流程 点我

阅读代码时的相关注释 点我

初始化逻辑

  1. servlet.init()
  2. HttpServletBean.init()
    解析web.xml中配置的,将DispatcherServlet包装成BeanWrapper,将参数设置到DispatcherServlet中.
  3. FrameworkServlet.initServletBean()
    初始化webApplicationContext,将servlet与spring容器关联.最终会调用AbstractApplicationContext.refresh(),spring容器启动的逻辑
  4. dispatcherServlet.onRefresh()
    刷新springMvc中所需的九大组件,初始化 multipartResolver,localeResolver,themeResolver,handlerMappings,handlerAdapters,handlerExceptionResolvers,requestToViewNameTranslator,viewResolvers,flashMapManager.

处理一次请求

  1. tomcat CoyoteAdapter调用各级管道(pipeline)中的阀(Value),
    StandardWrapper调filter链,最后调servlet.service(request, response)

  2. FrameworkServlet.processRequest(request, response)
    根据当前request创建对应的LocaleContext和RequestAttributes,并绑定到当前线程

  3. DispatcherServlet.doDispatch()
    3.1. 根据 handlerMapping,获取与当前request相匹配的Interceptor和Handler
    3.1.1. 从request中取出请求路径
    3.1.2. 通过 lookupPath 和 request 找到 handlerMethod,即通过URL查看映射到哪个方法和类
    3.1.2.1. 通过url获取匹配的 RequestMappingInfo,相当于@RequestMapping(value="/xxx")中value值匹配上了.但是@RequestMapping中还有其他配置项
    3.1.2.2. RequestMappingInfo中包含多个condition,保存从request提取出的用于匹配Handler的条件.依次检测是否匹配(method,param,header,consume,produce,pattern,costom)
    3.1.3. 添加interceptors,构建 handlerExecutionChain(包含 handler 和 interceptors) 返回给 DispatcherServlet

    3.2. 根据 handler 获取 handlerAdapter

    3.3. 执行相应 Interceptor链 的 preHandle() 方法

    3.4. 用 HandlerAdapter 处理 Handler
    3.4.1. RequestMappingHandlerAdapter 备好处理器所需要的参数.通过 HandlerMethodArgumentResolver 进行参数解析,解析出方法的参数名 和 请求的参数值
    3.4.2. 使用处理器处理请求,反射调用处理方法
    3.4.3. 处理返回值,也就是将不同类型的返回值统一处理成 ModelAndView 类型

    3.5. 执行相应 Interceptor链 的 postHandle(),逆序执行

    3.6. 若有视图需要渲染,则渲染视图
    3.6.1. modelAndView 中的 view 若是 String 类型,则调用 resolveViewName(),将 视图名 解析成 真实的视图对象
    3.6.2. 使用 view 和 model 数据 渲染页面

    3.7. 发出请求处理完成的通知,触发 Interceptor.afterCompletion(),逆序执行

你可能感兴趣的:(Spring)