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

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

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

一看便知,TransactionManagementConfigurationSelector又给容器注册了两个新组件:
- AutoProxyRegistrar
- 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;
执行目标方法 如果异常,获取到事务管理器,利用事务管理回滚操作; 如果正常,利用事务管理器,提交事务
浙公网安备 33010602011771号