@Enable*注解的应用之:声明式事务@EnableTransactionManagement详解

  SpringAOP应用之声明式事务中案例简明示范了声明式事务的使用,那么为什么@EnableTransactionManagement和@Transactional进行了相关的配置,就替代了aop复杂的xml配置呢?

  @EnableXXX一类的注解在Spring高级特性之三:@Enable*注解的工作原理 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中有通用详解。

              

   很显然@EnableTransactionManagement属于Spring高级特性之三:@Enable*注解的工作原理第二种通过条件选择加载配置来控制事务的管理。通过TransactionManagementConfigurationSelector类中的注释——Selects which implementation of {@link AbstractTransactionManagementConfiguration},可以理解选择实现了AbstractTransactionManagementConfiguration类的配置进行Bean的加载。

              

  ProxyTransactionManagementConfiguration实现了AbstractTransactionManagementConfiguration类:

              

  通过该类加载了上图中相关的bean。这三个方法是不是很熟悉:

    1、transactionAdvisor(): 这个方法用于创建 BeanFactoryTransactionAttributeSourceAdvisor 对象,作为事务的Advisor(通知器)。Advisor定义了在哪些切点上应用事务逻辑。该方法接收两个参数:transactionAttributeSource(事务属性源)和 transactionInterceptor(事务拦截器)。它将这两个对象设置到创建的 BeanFactoryTransactionAttributeSourceAdvisor 中,并根据需要设置Advisor的顺序。

    2、transactionAttributeSource(): 这个方法用于创建 AnnotationTransactionAttributeSource 对象,作为管理事务属性的事务属性源。AnnotationTransactionAttributeSource 是一个基于注解的事务属性源,用于从标注了事务注解的方法获取事务属性信息。

    3、transactionInterceptor(): 这个方法用于创建 TransactionInterceptor 对象,作为事务的拦截器。TransactionInterceptor 是一个AOP拦截器,用于在方法调用前后应用事务逻辑。它接收一个 transactionAttributeSource 参数,用于获取事务属性信息。如果配置了 txManager(事务管理器),则将其设置到创建的 TransactionInterceptor 中。
  是不是AOP的逻辑?显然注解方式实现了xml配置化的aop,方便了开发者的工作。所以通过@EnableTransactionManagement,可以开启对事务的AOP代理。

  还有两个问题:1)加载哪个事务管理器;2)对哪些方法或者类进行事务管理。  

  加载事务,通过调试:

              

  识别@Transactional,获取TransactionManager Bean:

              

  获取TransactionManager :

              

  之后保存在transactionManagerCache中:

              

   之后将根据条件判断是否需要将事务织入到方法中并执行,跟踪代码事务API由PlatformTransactionManager接口提供:

              

              

  关于PlatformTransactionManager及相关内容后续分享,本文重点在于@Enable**选择加载配置完成声明式事务。

 

posted on 2021-11-16 10:37  池塘里洗澡的鸭子  阅读(16)  评论(0编辑  收藏  举报