springboot解析@transaction注解原理

目录

第一步、全局搜索Transactional.class

第二步、查看哪里配置BeanFactoryTransactionAttributeSourceAdvisor

第四、SpringTransactionAnnotationParser是什么时候被注入的

第三、总结


先看一下@transaction的官网文档

16. Transaction Management

第一步、全局搜索Transactional.class

如下图所示,找到 SpringTransactionAnnotationParser类

 之后在  SpringTransactionAnnotationParser#isCandidateClass方法处断点查看调用栈

 我这里使用事物的类是 StudentService

 真正进行aop代理的地方是 Advisor,那么我在AbstractAdvisorAutoProxyCreator#findEligibleAdvisors方法里面进行条件断点

 发现这个advisor信息

 org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor: advice org.springframework.transaction.interceptor.TransactionInterceptor@3fce8fd9

 从中可以看出

advisor:BeanFactoryTransactionAttributeSourceAdvisor

advice:TransactionInterceptor

相信熟悉aop的同学一眼就能看出,transaction的commit或者rollback增强逻辑就在TransactionInterceptor里。

第二步、查看哪里配置BeanFactoryTransactionAttributeSourceAdvisor

还是老套路,扎到BeanFactoryTransactionAttributeSourceAdvisor类,ctrl+f找到哪些地方调用该类,猜测是在ProxyTransactionManagementConfiguration类里。

 点击进去果然验证猜想

 这样就解释了@transaction是如何被springboot解析的。

第四、SpringTransactionAnnotationParser是什么时候被注入的

直接给出结论:在 AnnotationTransactionAttributeSource初始化的时候初始化SpringTransactionAnnotationParser

第三、总结

1、springboot通过自动配置类ProxyTransactionManagementConfiguration, 设置@transaction的advisor(BeanFactoryTransactionAttributeSourceAdvisor)

2、BeanFactoryTransactionAttributeSourceAdvisor设置@transaction增强逻辑transactionInterceptor

3、在 AnnotationTransactionAttributeSource初始化的时候初始化SpringTransactionAnnotationParser。SpringTransactionAnnotationParser能判断一个类上是否有@transaction注解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值