这要从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. Regex实例

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. Linux - 压缩

    tar  tar zxvpf gz.tar.gz # 解包tar.gz 不指定目录则全解压; -C 放到指定目录 包中的目录: -o 是强制覆盖: tar zcvpf /$path/gz.tar.gz ...

  3. 定时器QTimer

    import sys from PyQt5.QtCore import QTimer, Qt from PyQt5.QtWidgets import QApplication, QWidget, QP ...

  4. “微信小程序商城构建全栈应用”开发小记

    注意事项: 1.application\api\extra下的wx.php记得填写小程序的app_id.app_secret: 2.API测试小工具需要APPID:

  5. [JLOI2015]装备购买 (高斯消元)

    [JLOI2015]装备购买 \(solution:\) 首先这道题的题面已经非常清晰的告诉我们这就是线性空间高斯消元的一道题(可以用某些装备来表示另一件装备,这已经不能再明显了),只是这道题要求我们 ...

  6. Adjoint of SE(3)

    以前看的书都提到 SE(3) 和 se(3) 的 Adjoint,但是并没有讲这个东西是干什么用的,只是给了一堆性质.这东西来自群论. 参考 Lie Groups for 2D and 3D Tran ...

  7. SVN备份还原

    本文是对SVN备份还原的一个简单记录 /*千万不能用VisualSVN Server PowerShell,否则在还原Load的时候会发生错误E140001,具体参考http://stackoverf ...

  8. group by与avg(),max(),min(),sum()函数的关系

    数据库表: create table pay_report(     rdate varchar(8),     --日期     region_id varchar(4),    --地市      ...

  9. weblogic基本目录介绍,位数查看,启动与发布项目,修改JVM参数,设置项目为默认项目

    这里的基本目录%base%表示安装目录,如我的目录为:E:/weblogic就是%base% 1.weblogic目录介绍 weblogic主要的目录介绍: 1.日志目录: 每个domain(域)都有 ...

  10. .NET中制做对象的副本(二)继承对象之间的数据拷贝

    定义学生 /// <summary> /// 学生信息 /// </summary> public class Student { /// <summary> // ...