Spring注解学习_声明式事务原理
上一篇文章中写了一个简单的开启Spring声明式事务的Demo,知其步骤为:
- 给组件方法标注上@Transactional 表示当前方法是一个事务方法
- 给组件上标注@EnableTransactionManagement 开启基于注解的事务管理功能
- 向容器注册事务管理器
由之前阅读理解AOP源码的经验可知,事务管理功能的开启重点在于 @EnableTransactionManagement 注解,那就看一看这个注解为容器导入了什么组件,所导入的组件又在什么时候起到了哪些作业:
¶@EnableTransactionManagement
-
该注解导入了组件TransactionManagementConfigurationSelector(事务管理配置Selector):
这个组件为XXXSelector,是ImportSeletor的实现类。由学习组件注册时的知识不难明白,它会以返回全类名方式给容器中导入组件。
-
查看 TransactionManagementConfigurationSelector 又到底导入了哪些组件:
它会视AdviceMode不同而返回不同的全类名数组,回看EnableTransactionManagement:
默认AdviceMode 为 AdviceMode.PROXY ,所以默认情况最终会将以下组件注册到容器中:
-
AutoProxyRegistrar
-
ProxyTransactionManagementConfiguration
-
¶AutoProxyRegistrar的作用
¶作用:
- 给容器注册一个InfrastructureAdvisorAutoProxyCreator组件
- InfrastructureAdvisorAutoProxyCreator(基础设施增强器自动代理创建者)分析:
- InfrastructureAdvisorAutoProxyCreator–》继承自AbstractAdvisorAutoProxyCreator --》继承自AbstractAutoProxyCreator
- AbstractAutoProxyCreator实现了SmartInstantiationAwareBeanPostProcessor接口,也是一个后置处理器:
- 利用后置处理器机制在对象创建以后,包装对象,返回一个代理对象(增强器),代理对象执行方法利用拦截器链进行调用
¶我的分析过程:
AutoProxyRegistrar会给容器注册一个InfrastructureAdvisorAutoProxyCreator组件:
InfrastructureAdvisorAutoProxyCreator组件的继承关系:
故InfrastructureAdvisorAutoProxyCreator祖上实现了SmartInstantiationAwareBeanPostProcessor接口,它是一个后置处理器:会利用后置处理器机制在对象创建以后,包装对象,返回一个代理对象(增强器),代理对象执行方法利用拦截器链进行调用。
SmartInstantiationAwareBeanPostProcessor 继承自 InstantiationAwareBeanPostProcessor。
InstantiationAwareBeanPostProcessor,继承自BeanPostProcessor。
容器会 在创建Bean实例之前先尝试 使用 实现了InstantiationAwareBeanPostProcessor接口的后置处理器 调用其postProcessBeforeInstantiation()方法返回的对象作为Bean实例,不行的话再自行创建Bean实例。
结合AOP原理可推测,InfrastructureAdvisorAutoProxyCreator正是利用后置处理器机制,在对象创建以后,包装对象,返回一个代理对象(增强器),代理对象执行方法利用拦截器链进行调用
¶ProxyTransactionManagementConfiguration作用
¶作用:
-
给容器中注册事务增强器:BeanFactoryTransactionAttributeSourceAdvisor
-
事务增强器要用到事务注解的信息,AnnotationTransactionAttributeSource可以协助其其解析事务注解
-
事务增强器要用到事务拦截器:TransactionInterceptor。TransactionInterceptor中保存了事务属性信息、事务管理器,它也是一个MethodInterceptor。
MethodInterceptor:在目标方法执行的时候,执行拦截器链(事务拦截器)
-
事务拦截器如何作用:
-
先获取事务相关的属性。
-
再获取PlatformTransactionManager,如果事先没有添加指定任何TransactionManager,最终会从容器中按照类型获取一个PlatformTransactionManager
-
执行目标方法
如果异常,获取到事务管理器,利用事务管理回滚操作
如果正常,利用事务管理器提交事务
-
-
¶我的分析过程:
查看ProxyTransactionManagementConfiguration配置类,发现里面注册了Bean:BeanFactoryTransactionAttributeSourceAdvisor(事务属性源增强器)、TransactionAttributeSource(事务属性源)、TransactionInterceptor(事务拦截器)
事务属性增强器从容器中获取事务属性源和事务拦截器。
未完待续
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,邮件至 708801794@qq.com
文章标题:Spring注解学习_声明式事务原理
文章字数:863
本文作者:梅罢葛
发布时间:2020-04-07, 23:28:49
最后更新:2020-04-08, 03:11:14
原始链接:https://qiurungeng.github.io/2020/04/07/Spring%E6%B3%A8%E8%A7%A3%E5%AD%A6%E4%B9%A0-%E5%A3%B0%E6%98%8E%E4%BA%8B%E5%8A%A1%E5%8E%9F%E7%90%86/