springbank 开发日志 springbank是如何注册handler的
这要从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的的更多相关文章
- springbank 开发日志 springbank是如何执行一个handler的requestMapping对应的方法的
占位 从dispatcher说起,方法doDispatch(Map request)的参数request是一个通过解析来报报文新城的map //获取HandlerExecutionChain,其中封装 ...
- springbank 开发日志 SpringMVC是如何找到handler找到对应的方法并执行的
从DispatcherServlet说起,本文讨论的内容都是DispatcherServlet的doDispatch方法完成 mappedHandler是一个HandlerExecutionChain ...
- springbank 开发日志 Spring启动过程中对自定义标签的处理
这篇随笔的许多知识来源于:http://www.importnew.com/19391.html 之所以会去看这些东东,主要是希望能够模仿spring mvc的处理流程,做出一套合理的交易处理流程. ...
- springbank 开发日志 阅读spring mvc的源代码真是受益良多
决定模仿spring mvc的dispatcher->handlerMapping(return executorChain)->handler.execute 这样的流程之后,就开始看s ...
- SpringBank 开发日志 Mybatis 使用redis 作为二级缓存时,无法通过cacheEnabled=false 将其关闭
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC ...
- SpringBank 开发日志 一种简单的拦截器设计实现
当交易由Action进入Service之前,需要根据不同的Service实际负责业务的不同,真正执行Service的业务逻辑之前,做一些检查工作.这样的拦截器应该是基于配置的,与Service关联起来 ...
- SpringBank 开发日志 使用maven构建dubbo服务的可执行jar包
写这篇日志的时候,我已经完成了这个目标,并且中间经历了一次面试.现在回过头看,已经觉得印象不那么深刻了,果然还是一边思考,一边记录这样最好.但我还是严格要求自己,从新做了梳理,对相关配置进行了整理和说 ...
- SpringBank 开发日志 重新设计Action调用Service的参数传递 使用泛型解决类型转换问题
之前想的比较简单,请求到达controller的时候,传给action的参数没有经过任何封装,就是一个Map.然后action再调用service的时候,传递的参数也是map @Controller ...
- springbank 开发日志 一次因为多线程问题导致的applicationContext.getBean()阻塞
几天前遇到的这个问题.由于交易是配置的,不同的交易是同一个类的不同实例,所以不可能提前将其以@autowired类似的方式注入到需要的类中 <op:transaction id="Re ...
随机推荐
- Java编程思想 学习笔记5
五.初始化与清理 1.用构造器确保初始化 在Java中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.创建对象时,如果其类具有构造器,Java就会在用户有能力操作对象之前自动调用相应的构造 ...
- 去除inline-block出现间距的几种方法
display:inline-block,简单来说就是将对象呈现为inline对象,但是对象的内容作为block对象呈现,之后的内联对象会排列在同一行 比如两个input,默认中间会产生一些间距 &l ...
- MySQL中查询行数最多的表并且排序
#切换到schema use information_schema; #查询数据量最大的30张表 并排序 select table_name,table_rows from tables order ...
- python安装模块方法汇总
方法一: 原文地址: http://blog.csdn.net/cighao/article/details/47860041 在 windows 系统下,只需要输入命令 pip install re ...
- Handler实现与机制 && Blocking Queue && IdleHandler使用
http://blog.csdn.net/boyupeng/article/details/46685343 IdleHandler处理消息的源码 final Message next() { ... ...
- PHP - CentOS下开发运行环境搭建(Apache+PHP+MySQL+FTP)
本文介绍如何在 Linux下搭建一个 PHP 环境.其中 Linux 系统使用是 CentOS 7.3,部署在阿里云服务器上. 1,连接登录服务器 拿到服务器的 ip.初始密码以后.我们先通过远程 ...
- 【PE结构】由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)
0 前言 此篇文章想写如何通过工具手查导出表.PE文件代码编程过程中的原理.文笔不是很好,内容也是查阅了很多的资料后整合出来的.希望借此加深对PE文件格式的理解,也希望可以对看雪论坛有所贡献.因为了解 ...
- Mean shift
转载:http://blog.csdn.net/google19890102/article/details/51030884 然后引入opencv中的pyrMeanShiftFiltering函数: ...
- UML和模式应用4:初始阶段(1)--概述
1.前言 UP开发包括四个阶段:初始阶段.细化阶段.构建阶段.移交阶段: 初始阶段是项目比较简短的起始步骤,主要目的是收集足够的信息来建立共同设想,调查项目的总体目标和可行性,确定是否值得进一步深入. ...
- 默认以管理员身份运行VS2013/15/17
方法如下: 1.右击VS的快捷方式,选择[属性],打开属性对话框,再点击[高级]按钮,如下图所示: 2.再勾选[用管理员身份运行],点击[确定]即可: 然后就可以双击VS快捷方式,直接以管理员身份运行 ...