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

原文地址:https://www.cnblogs.com/heben/p/7183380.html