美文网首页
3、SpringMVC请求的时候是如何找到正确的Controll

3、SpringMVC请求的时候是如何找到正确的Controll

作者: 那谁319 | 来源:发表于2019-06-02 14:28 被阅读0次
  • 在DispatcherServlet处理请求过程分析中简单梳理了doDispatch的执行流程
    • 获取Handler
    • 获取Adapter
    • 执行applyPreHandle
    • 执行handle方法
    • 执行applyPostHandle
    • 处理返回结果

未解决问题

  • 1、SpringMVC处理请求的时候如何找到相应Controller类和具体的方法呢?
    • 可以猜测SpringMVC处理请求的时候如何找到相应Controller类和具体的方法的逻辑肯定和Handler、Adapter相关。
  • 2、SpringMVC处理请求的时候是根据什么找到Controller类和具体的方法的呢?
    • 可以大胆猜测是根据HTTP请求的请求协议信息内容匹配到的。
  • 3、这些能够和请求协议关联上的内容放在哪的?什么时候放进去的?谁放进去的?
    • 可以大胆猜测spring mvc 是spring 全家桶的一部分,Controller也是Bean,应该也会交给Spring在启动过程中统一处理这些问题。

问题关联

  • XmlWebApplicationContext.refresh()逻辑,分析
  • DispatcherServlet.initStrategies逻辑,分析

简单总结一下

  • XmlWebApplicationContext.refresh()执行过程中,annotation-driven元素匹配的解析器AnnotationDrivenBeanDefinitionParser会注册RequestMappingHandlerMapping和RequestMappingHandlerAdapter的bean定义;
  • RequestMappingHandlerMapping的懒加载对象实例化后,调用了afterPropertiesSet()方法,最终在afterPropertiesSet()方法执行完毕后将带有@RequestMapping注解的java类的相关信息设置到实例化之后的RequestMappingHandlerMapping对象中。也就是说相关请求对应的Controller类和方法的匹配条件在bean被加载完成后就已准备好。
  • servlet执行init()逻辑时走到DispatcherServlet.initStrategies逻辑内部会把加载好的bean赋值给对应的属性
    /** List of HandlerMappings used by this servlet */
    private List<HandlerMapping> handlerMappings;

    /** List of HandlerAdapters used by this servlet */
    private List<HandlerAdapter> handlerAdapters;

    /** List of HandlerExceptionResolvers used by this servlet */
    private List<HandlerExceptionResolver> handlerExceptionResolvers;
  • 所以结合DispatcherServlet处理请求的执行逻辑(doDispatch的执行流程),可以知道在获取Handle对象时确定了具体的Controller类和方法。

获取Handler(HandlerExecutionChain)

  • 我们知道doDispatch的执行流程中会首先获取Handler,我们看下获取Handler的执行逻辑。


    DispatcherServlet.getHandler.png
  • 循环比遍历已经初始化的handlerMappings,调用handlerMapping的getHandler方法。
AbstractHandlerMapping.getHandler.png
  • 根据request参数获取对应的HandlerMethod对象;
  • 调用getHandlerExecutionChain方法。
AbstractHandlerMapping.getHandlerExecutionChain.png
  • 判断参数handler是否匹配HandlerExecutionChain,如果是把参数handler赋值给HandlerExecutionChain对象chain,如果不是new HandlerExecutionChain(handler);
  • 获取请求path,循环遍历adaptedInterceptors集合,添加匹配路径的拦截器到HandlerExecutionChain对象。
  • 自此Handler对象(HandlerExecutionChain)被创建完成。

相关文章

网友评论

      本文标题:3、SpringMVC请求的时候是如何找到正确的Controll

      本文链接:https://www.haomeiwen.com/subject/nqentctx.html