Spring注解学习_声明式事务原理

  1. @EnableTransactionManagement
  2. AutoProxyRegistrar的作用
    1. 作用:
    2. 我的分析过程:
  3. ProxyTransactionManagementConfiguration作用
    1. 作用:
    2. 我的分析过程:

上一篇文章中写了一个简单的开启Spring声明式事务的Demo,知其步骤为:

  1. 给组件方法标注上@Transactional 表示当前方法是一个事务方法
  2. 组件上标注@EnableTransactionManagement 开启基于注解的事务管理功能
  3. 向容器注册事务管理器

由之前阅读理解AOP源码的经验可知,事务管理功能的开启重点在于 @EnableTransactionManagement 注解,那就看一看这个注解为容器导入了什么组件,所导入的组件又在什么时候起到了哪些作业:

@EnableTransactionManagement

  1. 该注解导入了组件TransactionManagementConfigurationSelector(事务管理配置Selector):

    这个组件为XXXSelector,是ImportSeletor的实现类。由学习组件注册时的知识不难明白,它会以返回全类名方式给容器中导入组件。

  2. 查看 TransactionManagementConfigurationSelector 又到底导入了哪些组件:

    TransactionManagementConfigurationSelector

    它会视AdviceMode不同而返回不同的全类名数组,回看EnableTransactionManagement:

    EnableTransactionManagement

    默认AdviceMode 为 AdviceMode.PROXY ,所以默认情况最终会将以下组件注册到容器中:

    • AutoProxyRegistrar

    • ProxyTransactionManagementConfiguration

AutoProxyRegistrar的作用

作用:

  • 给容器注册一个InfrastructureAdvisorAutoProxyCreator组件
  • InfrastructureAdvisorAutoProxyCreator(基础设施增强器自动代理创建者)分析:
    • InfrastructureAdvisorAutoProxyCreator–》继承自AbstractAdvisorAutoProxyCreator --》继承自AbstractAutoProxyCreator
    • AbstractAutoProxyCreator实现了SmartInstantiationAwareBeanPostProcessor接口,也是一个后置处理器:
      • 利用后置处理器机制在对象创建以后,包装对象,返回一个代理对象(增强器),代理对象执行方法利用拦截器链进行调用

我的分析过程:

AutoProxyRegistrar会给容器注册一个InfrastructureAdvisorAutoProxyCreator组件:

注册了InfrastructureAdvisorAutoProxyCreator组件

InfrastructureAdvisorAutoProxyCreator组件的继承关系:

image-20200408010503579

故InfrastructureAdvisorAutoProxyCreator祖上实现了SmartInstantiationAwareBeanPostProcessor接口,它是一个后置处理器:会利用后置处理器机制在对象创建以后,包装对象,返回一个代理对象(增强器),代理对象执行方法利用拦截器链进行调用。

SmartInstantiationAwareBeanPostProcessor 继承自 InstantiationAwareBeanPostProcessor。

InstantiationAwareBeanPostProcessor,继承自BeanPostProcessor。

容器会 在创建Bean实例之前先尝试 使用 实现了InstantiationAwareBeanPostProcessor接口的后置处理器 调用其postProcessBeforeInstantiation()方法返回的对象作为Bean实例,不行的话再自行创建Bean实例。

结合AOP原理可推测,InfrastructureAdvisorAutoProxyCreator正是利用后置处理器机制,在对象创建以后,包装对象,返回一个代理对象(增强器),代理对象执行方法利用拦截器链进行调用

ProxyTransactionManagementConfiguration作用

作用:

  • 给容器中注册事务增强器:BeanFactoryTransactionAttributeSourceAdvisor

    • 事务增强器要用到事务注解的信息,AnnotationTransactionAttributeSource可以协助其其解析事务注解

    • 事务增强器要用到事务拦截器:TransactionInterceptor。TransactionInterceptor中保存了事务属性信息、事务管理器,它也是一个MethodInterceptor。

      MethodInterceptor:在目标方法执行的时候,执行拦截器链(事务拦截器)

    • 事务拦截器如何作用:

      1. 先获取事务相关的属性。

      2. 再获取PlatformTransactionManager,如果事先没有添加指定任何TransactionManager,最终会从容器中按照类型获取一个PlatformTransactionManager

      3. 执行目标方法

        如果异常,获取到事务管理器,利用事务管理回滚操作

        如果正常,利用事务管理器提交事务

我的分析过程:

查看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/
目录
×

喜欢就点赞,疼爱就打赏