• 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来引用的

  • 相关阅读:
    VS Code 中文显示乱码_ubuntu
    解决source insight不识别.cu文件的问题/sourceinsight设置.cu类型的文件
    PPT图片素材
    Jetson Xavier NX apt更换国内源
    xavier NX安装torchvision
    xavier NX上安装pytorch_前面一二三四是失败的方法,可以直接按照步骤五进行安装
    jquery.cookie()方法
    JavaScript错误处理
    Jquery中$.post()与$.get()区别
    jQuery中$.get()、$.post()和$.ajax()
  • 原文地址:https://www.cnblogs.com/heben/p/7183380.html
Copyright © 2020-2023  润新知