这要从DefaultAnnotationHandlerMapping这个类说起,该类被@Component注释,该类被Spring IOC容器实例化之后,将会执行其initApplicationContext方法(该方法在其父类中得到实现)

主要的几个类的继承关系如上图,其中ApplicationObjectSupport是由SpringFrameWork提供的抽象类

上图是ApplicationObjectSupport类中的两个方法,该类实现了ApplicationContextAware接口,并且在setApplicationContext方法中,调用了上图中的initApplicationContext(context)方法做初始化工作(虽然实际上图的实现中什么也没做,但子类却获得了初始化的机会),而该方法又调用了抽象的initApplicationContext()方法,我的AbstractTransactionHandlerMapping类间接实现了ApplicationObjectSupport类,并且initApplicationContext()方法也在该类中得到了实现,这将使得容器完成启动后,AbstractTransactionHandlerMapping的子类对象,也就是我的DefaultAnnotationHandlerMapping对象的initApplicationContext()方法(该方法的具体代码在父类AbstractTransactionHandlerMapping中)将会得到Spring框架的调用

如上图,我的AbstractTransactionHandlerMapping类在initApplicationContext中调用了detectHandlers方法,该方法通过determineTranscodesForHandler(beanName)完成handler的查找,通过registerHandler(transcodes, beanName)完成handler的注册

所以以下分别就这两个步骤进行说明:

1.查找

首先,将Spring容器中所有的Singleton的BeanName取出来,放到String数组中

该数组的内容如上图。

如上图,determineTranscodesForHandler是在AbstractDetectingTransactionHandlerMapping的子类DefaultAnnotationHandlerMapping中实现的

该方法首先拿到容器,根据beanName取得其对应的Class对象,接下来AnnotationUtils.findAnnotation(handlerType, Controller.class)方法可以判断该类是否有Controller注解,如果没有那就说明没有符合要求的handler,如果有,自然要继续往该类的方法里面去找,哪些方法有我定义的@TransactionMapping方法,有了这些方法的Controller才能称之为一个SpringBank的handler

接下来determineTransactionForHandlerMethods里面的处理比较多余,实际上我并不需要去判断接口是否有注解,这里主要是参考并保留了SpringMVC的做法。对我来说,主要的逻辑就是取得Controller的类对象之后,判断一下里面哪些方法有@TransactionMapping注解,并且将注解里的Transaction对应的值取出来,放到一个Set中,最终这个Set的值类似于[Recharge, CreateOwner]

2.注册

当走到registerHandler这个方法时,其参数将会是这样:String[] transcodes = [CreateOwner, Recharge] ; String beanName = transactionController

这一步的处理已经很简单了,就是根据handler的名字取得容器中它的对象,然后以存在handlerMap中,最终handlerMap看起来将会和下面这样差不多:

handlerMap: {CreateOwner=com.springbank.portal.controller.TransactionController@651aed93, Recharge=com.springbank.portal.controller.TransactionController@651aed93}

springbank 开发日志 springbank是如何注册handler的的更多相关文章

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

    占位 从dispatcher说起,方法doDispatch(Map request)的参数request是一个通过解析来报报文新城的map //获取HandlerExecutionChain,其中封装 ...

  2. springbank 开发日志 SpringMVC是如何找到handler找到对应的方法并执行的

    从DispatcherServlet说起,本文讨论的内容都是DispatcherServlet的doDispatch方法完成 mappedHandler是一个HandlerExecutionChain ...

  3. springbank 开发日志 Spring启动过程中对自定义标签的处理

    这篇随笔的许多知识来源于:http://www.importnew.com/19391.html 之所以会去看这些东东,主要是希望能够模仿spring mvc的处理流程,做出一套合理的交易处理流程. ...

  4. springbank 开发日志 阅读spring mvc的源代码真是受益良多

    决定模仿spring mvc的dispatcher->handlerMapping(return executorChain)->handler.execute 这样的流程之后,就开始看s ...

  5. SpringBank 开发日志 Mybatis 使用redis 作为二级缓存时,无法通过cacheEnabled=false 将其关闭

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC ...

  6. SpringBank 开发日志 一种简单的拦截器设计实现

    当交易由Action进入Service之前,需要根据不同的Service实际负责业务的不同,真正执行Service的业务逻辑之前,做一些检查工作.这样的拦截器应该是基于配置的,与Service关联起来 ...

  7. SpringBank 开发日志 使用maven构建dubbo服务的可执行jar包

    写这篇日志的时候,我已经完成了这个目标,并且中间经历了一次面试.现在回过头看,已经觉得印象不那么深刻了,果然还是一边思考,一边记录这样最好.但我还是严格要求自己,从新做了梳理,对相关配置进行了整理和说 ...

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

    之前想的比较简单,请求到达controller的时候,传给action的参数没有经过任何封装,就是一个Map.然后action再调用service的时候,传递的参数也是map @Controller ...

  9. springbank 开发日志 一次因为多线程问题导致的applicationContext.getBean()阻塞

    几天前遇到的这个问题.由于交易是配置的,不同的交易是同一个类的不同实例,所以不可能提前将其以@autowired类似的方式注入到需要的类中 <op:transaction id="Re ...

随机推荐

  1. 缓存穿透、雪崩、热点与Redis

    (拼多多问:Redis雪崩解决办法) 导读:互联网系统中不可避免要大量用到缓存,在缓存的使用过程中,架构师需要注意哪些问题?本文以 Redis 为例,详细探讨了最关键的 3 个问题. 一.缓存穿透预防 ...

  2. 读取Excel中数据

    #region 读取导入Excel数据 /// <summary> /// /// </summary> /// <param name="filename&q ...

  3. luogu P1084 疫情控制

    传送门 首先,所有军队又要尽量往上走,这样才能尽可能的封锁更多的到叶子的路径 而随着时间的增加,能封锁的路径也就越来越多,所以可以二分最终的时间 然后对于每个时间,就让能走到根的军队走到根,记录到根上 ...

  4. tomcat杂记

    组成 Server –> Service –> Connector & Container( Engine –> Host –> Context( Wrapper( S ...

  5. kali linux 破解wpa密码

    apt-get update apt-get install hostapd-wpe ls -l /etc/hostapd-wpe/ nano /etc/hostapd-wpe/hostapd-wpe ...

  6. (原)tensorflow中使用指定的GPU及GPU显存

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6591923.html 参考网址: http://stackoverflow.com/questions ...

  7. L-BFGS算法(转载)

    转载链接:http://blog.csdn.net/itplus/article/details/21897715 前面的拟牛顿法.DFP.BFGS.L-BFGS算法简短总结一下就是: 牛顿法不仅使用 ...

  8. awk对列/行进行统计求和【转】

    场景]--类似于excel中的sum函数对列/行进行统计求和 A01 A02 A03 A09 [要求1]--对列进行统计求和 A01 A02 A03 A09 TOTAL [要求2]--对行进行统计求和 ...

  9. 通达OA系统myisam转innodb引擎

    OA系统切换到linux环境后,性能提升了2-3倍左右,随着公司的发展壮大,办公人员也会越来越多,当人数达到一定数量级别时如1500在线人数已无法支撑公司业务,就需要对系统进行性能提升优化. 当前OA ...

  10. Spring MVC注解配置

    http://blog.csdn.net/eventys/article/details/8208808