声明式事务源码分析

声明式事务工作原理

@EnableTransactionManagement注解会给容器中导入TransactionManagementConfigurationSelector组件

@EnableTransactionManagement注解的AdviceMode默认值为Proxy
在这里插入图片描述
TransactionManagementConfigurationSelector组件会调用selectImports()方法带导入AutoProxyRegistrarProxyTransactionManagementConfiguration这两个组件在这里插入图片描述

AutoProxyRegistrar组件给容器中注册Bean

AutoProxyRegistrar实现了ImportBeanDefinitionRegistrar接口,会调用registerBeanDefinitions()方法给容器中注册Bean
在这里插入图片描述
判断mode==AdviceMode.Proxy,然后调用AopConfigUtilsregisterAutoProxyCreatorIfNecessary()方法,进而调用registerOrEscalateApcAsRequired()方法,给容器中注册一个InfrastructureAdvisorAutoProxyCreator组件,这个组件也是一个后置处理器
在这里插入图片描述
InfrastructureAdvisorAutoProxyCreator组件利用后置处理器机制在对象创建以后,包装对象,返回一个代理对象(增强器),代理对象执行方法利用拦截器链进行

ProxyTransactionManagementConfiguration组件给容器中注册事务增强器

ProxyTransactionManagementConfiguration是一个配置类,给容器中注册事务增强器

在这里插入图片描述
AnnotationTransactionAttributeSource()方法会解析事务注解
在这里插入图片描述
SpringTransactionAnnotationParserparseTransactionAnnotation()方法进行解析注解
在这里插入图片描述
除了解析事务注解信息,还要执行事务拦截器TransactionInterceptor,事务拦截器保存了事务属性信息,还保存了事务管理器
在这里插入图片描述
TransactionInterceptor实现了MethodInterceptor接口,容器中代理对象执行目标方法时,方法拦截器来链就会执行
在这里插入图片描述
invokeWithinTransaction()方法利用事务进行工作,现获取TransactionAttribute事务相关的属性,再获取PlatformTransactionManager平台事务管理器
在这里插入图片描述
determineTransactionManager()方法来获取事务管理器,如果有指定的就获取指定的事务管理器,如果没有指定,就会从容器中获取注册的事务管理器
在这里插入图片描述
invocation.proceedWithInvocation()执行事务方法,与之前MethodInvocation执行机制一样
在这里插入图片描述
completeTransactionAfterThrowing()处理异常的方法会获取事务管理器,进行回滚
在这里插入图片描述
如果没有异常,获取事务管理器提交事务
在这里插入图片描述在这里插入图片描述

总结

  • @EnableTransactionManagement注解会给容器中导入AutoProxyRegistrarProxyTransactionManagementConfiguration两个组件

  • AutoProxyRegistrar组件:
    (1)这个组件会给容器中注册一个InfrastructureAdvisorAutoProxyCreator组件
    (2)InfrastructureAdvisorAutoProxyCreator组件是一个后置处理器
    (3)InfrastructureAdvisorAutoProxyCreator利用后置处理器机制在对象创建以后,包装对象并返回一个代理对象,代理对象执行目标方法时,利用拦截器链进行增强处理

  • ProxyTransactionManagementConfiguration组件:
    (1)这个组件用来给容器中注册事务增强器
    (2)事务增强器需要用到事务注解信息,使用AnnotationTransactionAttributeSource解析事务注解
    (3)事务拦截器TransactionInterceptor事务拦截器实现了MethodInvocation接口,用来保存事务属性信息,保存事务管理器
    (4)代理对象执行目标方法时,会执行事务拦截器链
    (5)链中每一个事务拦截器都是:先获取事务相关的属性;再获取PlatformTransactionManager平台事务管理器,如果没有指定任何的事务管理器,就会从容器中按照类型获取一个事务管理器;最后执行目标方法,如果出现异常,则会获取到事务管理器,利用事务管理器进行回滚操作,如果没有出现异常,则会获取事务管理器,利用事务管理器提交事务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值