Spring声明式事务

@EnableTransactionManagement是真正让框架实现事务代理,拦截的核心,下面,我们通过源码来看看它的实现和工作原理。

1.@EnableTransactionManagement源码

 

 

 

 

 

 

 

那为什么加上这个注解就开启了事务功能呢?我们注意到,在注解定义的时候,引入了一个TransactionManagementConfigurationSelector

 

 

 也就是在spring容器中有注册了一个事务选择器插件,那这个插件又是干啥的呢?我们继续扒代码:

 

 

 

一看便知,TransactionManagementConfigurationSelector又给容器注册了两个新组件:

  1. AutoProxyRegistrar
  2. ProxyTransactionManagementConfiguration

下面我们接着研究默认注册进来的两个插件是干啥用的。

AutoProxyRegistrar

 

 

 

 注意到以上代码中有一句很关键:AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry);

 

 

继续跟进 InfrastructureAdvisorAutoProxyCreator

 

 

 

 发现继承了SmartInstantiationAwareBeanPostProcessor后置处理器,bean的初始化前后进行调用

 

 

 

 

 

 注意wrapIfNecessary这个方法

 

 

 

Objectproxy = createProxy(bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));

由此可见:InfrastructureAdvisorAutoProxyCreator利用后置处理器机制在对象创建以后,包装对象,返回一个代理对象(增强器),代理对象执行方法利用拦截器链进行调用;

ProxyTransactionManagementConfiguration

 

 

 上面的代码,是给容器注册了事务增强器。

 

 

 事务增强器要用事务注解的信息,AnnotationTransactionAttributeSource解析事务注解

 

 

 

事务拦截器:TransactionInterceptor;保存了事务属性信息,事务管理器;

他是一个 MethodInterceptor,在目标方法执行的时候,执行拦截器链。

 

目标方法执行TransactionAspectSupport

 

 

 

 

具体的事务拦截器执行流程如下:

先获取事务相关的属性
再获取PlatformTransactionManager,如果事先没有添加指定任何transactionmanger,最终会从容器中按照类型获取一个PlatformTransactionManager;
执行目标方法  如果异常,获取到事务管理器,利用事务管理回滚操作; 如果正常,利用事务管理器,提交事务

 

posted on 2020-05-28 11:18  孤单的帆船  阅读(169)  评论(0)    收藏  举报

导航