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

Posted 注销了

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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来引用的

以上是关于springbank 开发日志 springbank是如何执行一个handler的requestMapping对应的方法的的主要内容,如果未能解决你的问题,请参考以下文章

SpringBank 开发日志 重新设计Action调用Service的参数传递 使用泛型解决类型转换问题

如何仅使用开发人员的日志过滤日志?

开发者选项日志级别,选哪个好

FFmpeg开发实战:FFmpeg 打印日志

开发日志

后端开发总结:日志打印