- 前言
- @EnableTransactionManagement
- AutoProxyRegistrar
- InfrastructureAdvisorAutoProxyCreator
- ProxyTransactionManagementConfiguration
- AnnotationTransactionAttributeSource(事务注解信息)
- TransactionInterceptor(事务拦截器)
- end...
说起事务,其实现过程相信大家都很熟悉,只要给我们的方法加上 @Transactional 注解,就可以实现事务的功能了,因此,这里不再赘述事务的实现,本篇文章将对声明式事务的实现进行简单的源码分析。文章课程链接:尚硅谷spring注解驱动教程(雷神)
@EnableTransactionManagement在分析AOP源码时,我们也是按照这个流程来进行的,首先分析开启功能的注解 @Enablexxx,这里就是 @EnableTransactionManagement ,点进这个注解,我们发现,它用 TransactionManagementConfigurationSelector 给容器导入组件,如图:
进入到 TransactionManagementConfigurationSelector 中,我们看看它导入了哪些组件,如图:
AutoProxyRegistrar这里根据 adviceMode 来判断,如果是PROXY 就导入 AutoProxyRegistrar、ProxyTransactionManagementConfiguration 组件,我们发现 advice 是 EnableTransactionManagement 的一个属性,其默认值就是 PROXY(AdviceMode mode() default AdviceMode.PROXY;),因此,TransactionManagementConfigurationSelector 就导入了这两个组件,下面来分别分析这两个组件。
我们点进去,发现它实现了 importBeanDefinitionRegistrar ,就是给我们注册组件的,它会调用 registerBeanDefinitions() 方法,源码如图,首先是获取各种信息,获取了一个 mode,就是我们刚刚讲到 PROXY,因此,执行第二个红框下面的方法 AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry); 下面还有一个判断,这个值也是 EnableTransactionManagement 的一个属性,默认值为 false(boolean proxyTargetClass() default false;),因此不执行下面的方法
我们点到 AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry); 中,通过名称翻译,我们知道这是一个自动代理创建器,进来后是这样
继续跟进,进入方法registerOrEscalateApcAsRequired(InfrastructureAdvisorAutoProxyCreator.class, registry, source); 这里要注意,我们传入的第一个参数为 InfrastructureAdvisorAutoProxyCreator.class
InfrastructureAdvisorAutoProxyCreator这里我们就很熟悉了,跟AOP的源码逻辑一模一样,就是帮我们注册了一个名称为 org.springxx.xxx.internalAutoProxyCreator 的组件,类型为 InfrastructureAdvisorAutoProxyCreator,对应源码为倒数第二行。下面,我们对这个组件进行分析
上面我们分析得出,# AutoProxyRegistrar
帮我们注册了一个 InfrastructureAdvisorAutoProxyCreator。我们点进去看看,这里给出源码图和继承关系图。
ProxyTransactionManagementConfiguration我们发现,它也是一个后置处理器,如红框,它有什么作用呐,这就和前面分析的AOP的原理一样了,利用后置处理器机制在对象创建以后,包装对象,返回一个代理对象(增强器),代理对象执行方法利用拦截器链进行调用。
AnnotationTransactionAttributeSource(事务注解信息)分析完 AutoProxyRegistrar,我们继续分析导入的另一个组件,点进 ProxyTransactionManagementConfiguration,发现它是一个配置类(从名称也能看出),它又通过 @Bean 注册了各种组件,其中第一个是 BeanFactoryTransactionAttributeSourceAdvisor (事物增强器),下面,我们将依次分析它设置进去的值,这里第二行代码,它设置了一个事务属性,这个事务属性又在下面被注册的
我们跟进这个 AnnotationTransactionAttributeSource() 方法,点进来调用了 this(),调到了下面的方法,这个方法分别解析了 Spring 的事务注解解析器,Jta 的事务注解解析器和 Ejb3 的事务注解解析器。
TransactionInterceptor(事务拦截器)下一步,我们进入到Spring 的事务注解解析器中,我们发现有一个注解解析器的方法,帮我们解析了事务注解中的各个属性值,包括 timeout、value等等。因此,这里就是利用 AnnotationTransactionAttributeSource 帮我们解析事务注解
同样的,我们分析第二个设置进去的值,它和 AnnotationTransactionAttributeSource 一样,都是通过 @Bean来注册的。这里它将事务属性信息保存起来,也将事务管理器保存了起来。
我们进入到 TransactionInterceptor,发现它实现了方法拦截器 MethodInterceptor,我们前面给容器中放了一个代理对象,现在需要执行目标方法了,这个方法拦截器就会帮我们拦截,执行拦截器链,我们看到,有一个 invoke() 方法,是不是很熟悉呐,AOP源码分析时就遇到了。
跟进 invoke() 方法中的 invokeWithinTransaction,首先它获取了事务属性和事务管理器,如何获取的可以自己点进去看看,这里简单说一下 TransactionManager 的获取,如果事先没有指定任何 TransactionManager,最终会从容器中按照类型获取一个,我的源码和视频中的已经有很大区别,在目标代码前面进行了几次判断,这里暂不深究,在我展示的else 代码块中,首先创建一个保存了 PlatformTransactionManager 的 txInfo,然后来到第一个红框(目标方法的执行),如果出现异常,catch 捕获,运行第二个红框,进行事务的回滚,如果没有问题,那么最后执行第三红框(提交事务)。
异常回滚方法代码截图:
提交方法代码截图
至此,我们的整个源码分析结束,其中的许多细节还需要我们去深究,下来要多花花时间打断点调试理解一下。
如果总结的还行,就点个赞呗 @_@ 如有错误,欢迎指点,下一篇待编写···
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)