Spring 事物Transaction

时间:2023-12-14 15:53:56

日常开发中Spring 为我们提供了两种事物的定义方式

    XML 配置 方式 :这种方式配置起来比较麻烦,但后期比较好进行维护

    注解方式:配置起来比较方便,也是日常开发常用的;

我们这里进行第二种注解的形式的说明:如下是spring 注解开发的配置

    <!-- 事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref ="dataSource"/>
</bean> <!-- 使用注解方式定义事务 -->
<tx:annotation-driven transaction-manager="transactionManager" />

接下来我们围绕着如下几个问题进行Spring 事物的展开:

1.<tx:annotation-driven transaction-manager="transactionManager" /> 进行了哪些操作
2.如何进行匹配哪些类需要增强并生成代理
3.事物的传播机制

第一个问题:  <tx:annotation-driven transaction-manager="transactionManager" /> 进行了哪些操作

  自定义标签解析:org.springframework.transaction.config.TxNamespaceHandler

Spring 事物Transaction

  解析:

Spring 事物Transaction

  注册相关配置类

Spring 事物Transaction

 向事物拦截器中注册事物管理器的属性:

Spring 事物Transaction

 至此,已经注册了 InfrastructureAdvisorAutoProxyCreator ,AnnotationTransactionAttributeSource,TransactionInterceptor ,BeanFactoryTransactionAttributeSourceAdvisor

 这四个类;这四个类的作用,我们后面就能看出来;

  第二个问题: 如何进行匹配哪些类需要增强并生成代理?

  这个问题,需要看我们在注册的时候注册的 InfrastructureAdvisorAutoProxyCreator 类 代理生成器了,我们看它的类结构 有实现 BeanPostProcessor 接口

  这个接口的作用以及调用实际,请看我上一篇文章;

  我们直奔主题看  warpIfNecessary(..)方法

Spring 事物Transaction

    点击进去:

Spring 事物Transaction

Spring 事物Transaction

Spring 事物Transaction

  往下面点,会进入canApply 方法:

Spring 事物Transaction

   getTransactionAttributeSource() 就是得到我们第一步装配的AnnotationTransactionAttributeSource 是用来获取事物配置的;

Spring 事物Transaction

    接下来就是真正的校验方法了:

Spring 事物Transaction

Spring 事物Transaction

Spring 事物Transaction

    解析方法上的注解,类上也一样

Spring 事物Transaction

    发现注解,解析注解属性

Spring 事物Transaction