• springbank 开发日志 springbank是如何执行一个handler的requestMapping对应的方法的


    占位

    从dispatcher说起,方法doDispatch(Map request)的参数request是一个通过解析来报报文新城的map

    //获取HandlerExecutionChain,其中封装了handler和List<HandlerInterceptor>
    HandlerExecutionChain mappedHandler = getHandler(request);

    1.根据request得到一个执行链,查找的基础是已经注册过,注册之后在DefaultAnnotationHandlerMapping的实例中,handlerMap里(定义在其抽象父类里),保存了transaction与handler的对应关系

    所以去的时候也是取这个map里面进行查找

    HandlerAdapter ha = getHandlerAdapter(executionChain.getHandler());
    protected HandlerAdapter getHandlerAdapter(Object handler) {
        for (HandlerAdapter ha : this.handlerAdapters) {
            if (ha.supports(handler)) {
                return ha;
            }
        }
        ExceptionHandler.throwExcep("00000002",null);
        return null;
    }

     2.根据handler得到适配器,实际上在SpringMVC里面,这一步handlerAdapter有许多实现,所以每一个都要判断一下是否supports(handler),但我其实就只有一个AnnotationMethodHandlerAdapter

     而所谓是否支持,也只是看其持有的HandlerMethodResolverImpl的handlerMethod是否为空

    这类需要重点说明,HandlerMethodResolver这个类:

    1.其内部持有一个private final Map<Class<?>, HandlerMethodResolverImpl> methodResolverCache 这样一个MAP

    2.该类主要的工作,是通过getMethodResolver方法,返回一个MethodResovler,返回之前,每个MethodResolver和传进来的handler的对应关系都存放在上面这个methodResolverCache 中

    3.每个handler都会对应一个全新的HandlerMethodResolverImpl的实例,

    4.每个MethodResolver内部持有一个名叫handlerMethods的Set,其中存放了handler中所有被@TransactionMapping注释的Method对象

    也许将来我又多个Adapter的实现,便能轻松实现扩展,但目前我觉得好像没有这方面的需求

    得到适配器之后,就是执行了,执行这一步反而是比较简单的,无非就是反射,而使用反射的原因,主要是低耦合设计,handler在adpater内部是使用Object来引用的

  • 相关阅读:
    (转)软件架构设计
    (转)IDG副总裁楼军:顶级VC青睐什么样的创业者
    (转)使用Aspose.Cell控件实现Excel高难度报表的生成(一)
    (转)创业者应该有的5个正常心态
    (转)成功创业者的7个好习惯
    (转)SqlServer2008 数据库同步的两种方式 (发布、订阅)
    (转)Salesforce的440亿美金并购宣告企业软件市场进入3.0互联网化时代
    (转)创始人之间如何分股权:按贡献估值
    (转)各种大型网站技术架构
    使用FileSystem类进行文件读写及查看文件信息
  • 原文地址:https://www.cnblogs.com/heben/p/7183380.html
Copyright © 2020-2023  润新知