meepo源码解析系列(四)之启动详解
启动详解
- 本篇文章开始,我们将开始阅读源码
首先看任何框架的源码都需要找到框架的入口,meepo也不例外,先看meepo-test里bussiness方法片段
以上的事务配置和本地事务没有区别,用一个@Transactional注解表示方法的sql被事务管理。
我们知道,spring的声明式事务由aop实现,在注解方法前后加上事务控制代码,如下
获取事务管理器
final PlatformTransactionManager tm = determineTransactionManager(txAttr);
这里的transactionManager,可以是spring默认,也可以我们自己在xml里配置一个实现PlatformTransactionManager接口的bean来代替
jar包里的jta-supports-dubbo.xml配置了spring支持JTA的事务管理器
这样JtaTransactionManager接管了spring的声明式事务,如上面的回滚和提交代码
JtaTransactionManager 解析
按照JTA规范,JtaTransactionManager里初始化了userTransaction和transactionManager两个成员实例,这里不清楚的同学再回头看上篇文章里的 JTA 深度历险
我们继续跟踪代码,进入userTransaction的实现类UserTransactionImpl 方法
这里的begin()方法作用是初始化全局事务,在前面invokeWithinTransaction的调用路径如下
最后的doBegin()方法是AbstractPlatformTransactionManager的一个虚拟方法,在自定义子类JtaTransactionManager中实现具体功能,这里用到了模版方法设计模式
JtaTransactionManager把doBegin()委托给了userTransaction,如下
userTransaction又委托给了transactionManager,如第一个图所示。
这里需要说明的是,userTransaction把所有的实现都委托给了transactionManager,实际上是不需要这一层。userTransaction是JTA规范的一部分,属于用户编程,可以开放给客户端重写
小结本文讲述了spring声明式事务的实现,以及自定义事务管理器如何接管spring的事务管理器
注意当前还没涉及到分布式事务具体实现,阅读本文需要先了解JTA规范
图中的spring代码入口是JdkDynamicAopProxy类,如果用cglib,则是CglibAopProxy类