书接上回 ,我们针对spring中的ApplicationContext类的扩展功能-事件发布和监听处理源码进行了解析,知道了消息是如何存放和传递给监听器处理的。这章我们看下另外一个重量级的组件@Transactional事务处理是如何实现的。
我们可能都了解过声明式的事务处理用法是在需要事务的方法或类添加@Transactional注解,然后用springaop来切面处理事务,但是不清楚具体的处理流程,我们接着看:
打开spring-tx的源码,看到Transactional这个注解,以及对应的解释类,打开这个解释类,
首先看第一个方法parseTransactionAnnotation,这个方法中的工具类能够给查找用到了Transaction注解的方法或者类,在取到对应的注解使用位置属性集后,进行处理,处理过程如下
看得出来只是取注解中的对应属性值set到这个rbta对象中,然后进行返回。到这里我们只能看到是通过获取使用了注解的类或方法位置组装对应属性值进行返回。接着看是哪里调用的这个方法。
往上面引用点击几次看到这个类,上层调用开头讲到的方法时候传入了类或者方法对象,根绝我们知道的反射和切面处理,有了class对象和method对象,就可以进行代理。
接下来看TransactionAspectSupport类的方法,我们总算可以知道组装好往上返回的TransactionAttribute对象是如何使用的,
根据attributes中的属性qualifier组装一个transactionManager对象。
接着看这里边的方法内容,如果是用到了响应式编程事务,走这里边,如果看最终执行结果可以忽略下边。直接看之后的方法调用:
最终执行到下边AbstractPlatformTransactionManager
包括了多种操作数据库中间件的插件指令进行调用。
查看jdbc的commit
总结:可以从事务注解的解释器开始,查看调用入口和实际调用最终位置,包括了1.如何获取添加了事务注解的类或方法,2.组装事务相关属性值以便组装transactionalManager进行事务调用。3.根据不同的数据库处理调用到数据库本身的提交,回滚等指令。
用到了反射,代理 aop切面处理等。
拓展:
ProjectReactor 其核心思想观察者模式,定义了发布者和订阅者以及订阅三个接口,
Publisher 的两个实现类已经出现 MonoJust 和 MonoMapFuseable。MonoJust 负责存储原始数据,MonoMapFuseable 用于处理数据,并负责构建 Publisher 链表。
终于看到核心调用 用组装好的transactionManager在调用完成后进行提交事务
从上一步和这里开始所用到的处理都是mono和响应式编程的处理,所以如果要更好的理解,需要对响应式编程进行深入了解ProjectReactor 响应式框架。