Spring注解开发——38、声明式事务-源码分析

总结:和AOP原理一样

1、@EnableTransactionManagement

利用TransactionManagementConfigurationSelector给容器中会导入组件

导入两个组件

  1. AutoProxyRegistrar
  2. ProxyTransactionManagementConfiguration

2、AutoProxyRegistrar

  • 给容器中注册一个 InfrastructureAdvisorAutoProxyCreator 组件;
  • InfrastructureAdvisorAutoProxyCreator:?
  • 利用后置处理器机制在对象创建以后,包装对象,返回一个代理对象(增强器),代理对象执行方法利用拦截器链进行调用;

3、ProxyTransactionManagementConfiguration 做了什么?

给容器中注册事务增强器;

  1. 事务增强器要用事务注解的信息,AnnotationTransactionAttributeSource解析事务注解
  2. 事务拦截器:
    1. TransactionInterceptor;保存了事务属性信息,事务管理器;
    2. 他是一个 MethodInterceptor;
    3. 在目标方法执行的时候;执行拦截器链;事务拦截器:
      1. 先获取事务相关的属性
      2. 再获取PlatformTransactionManager,如果事先没有添加指定任何transactionmanger 最终会从容器中按照类型获取一个PlatformTransactionManager;
      3. 执行目标方法
        1. 如果异常,获取到事务管理器,利用事务管理回滚操作;
        2. 如果正常,利用事务管理器,提交事务

1、 @EnableTransactionManagement

Spring注解开发——38、声明式事务-源码分析

Spring注解开发——38、声明式事务-源码分析

因为adviceMode默认是PROXY,所以@EnableTransactionManagement利用TransactionManagementConfigurationSelector组件给我们向容器注入了AutoProxyRegistrar和ProxyTransactionManagementConfiguration组件


2 AutoProxyRegistrar

AutoProxyRegistrar实现了ImportBeanDefinitionRegistrar接口重写registerBeanDefinitions()方法会手动像容器中注册组件

Spring注解开发——38、声明式事务-源码分析

Spring注解开发——38、声明式事务-源码分析

跟源码,发现给我们手动注册了InfrastructureAdvisorAutoProxyCreator这个组件,这个组件又是做什么的呢?我们继续看源代码

Spring注解开发——38、声明式事务-源码分析

最后发现InfrastructureAdvisorAutoProxyCreator implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware。这说明InfrastructureAdvisorAutoProxyCreator这组件其实就是一个InstantiationAwareBeanPostProcessor后置处理器,会在所有bean初始化之后拦截,判断当前bean是否需要增强,如果需要的话,那么给其包装成一个代理对象。当使用这个bean的方法的时候,代理对象会拦截进行功能增强。好了,我们知道@EnableTransactionManagement注解给我们注册的AutoProxyRegistrar这个组件是给我们注册了InfrastructureAdvisorAutoProxyCreator这个组件,并且知道了其作用。下面我们看一下@EnableTransactionManagement给我们注册的另外一个组件ProxyTransactionManagementConfiguration的作用
 

3 ProxyTransactionManagementConfiguration

Spring注解开发——38、声明式事务-源码分析

我们看到ProxyTransactionManagementConfiguration就是个配置类,给我们向容器注册了BeanFactoryTransactionAttributeSourceAdvisor这个事务增强器,BeanFactoryTransactionAttributeSourceAdvisor设置了TransactionAttributeSource和TransactionInterceptor这两个属性

3.1 TransactionAttributeSource的作用

Spring注解开发——38、声明式事务-源码分析

3.2 TransactionInterceptor的作用

Spring注解开发——38、声明式事务-源码分析

我们发现TransactionInterceptor实现了MethodInterceptor接口,那么在执行目标方法的时候,会被执行拦截器链,执行到这个事务拦截器会做一下操作

Spring注解开发——38、声明式事务-源码分析

Spring注解开发——38、声明式事务-源码分析

Spring注解开发——38、声明式事务-源码分析