springboot解析@transaction注解原理

目录

第一步、全局搜索Transactional.class

第二步、查看哪里配置BeanFactoryTransactionAttributeSourceAdvisor

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

第三、总结


先看一下@transaction的官网文档

16. Transaction Management

第一步、全局搜索Transactional.class

如下图所示,找到 SpringTransactionAnnotationParser类

springboot解析@transaction注解原理_第1张图片

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

springboot解析@transaction注解原理_第2张图片

 我这里使用事物的类是 StudentService

springboot解析@transaction注解原理_第3张图片

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

springboot解析@transaction注解原理_第4张图片

 发现这个advisor信息

 org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor: advice org.springframework.transaction.interceptor.TransactionInterceptor@3fce8fd9springboot解析@transaction注解原理_第5张图片

 从中可以看出

advisor:BeanFactoryTransactionAttributeSourceAdvisor

advice:TransactionInterceptor

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

第二步、查看哪里配置BeanFactoryTransactionAttributeSourceAdvisor

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

springboot解析@transaction注解原理_第6张图片

 点击进去果然验证猜想

springboot解析@transaction注解原理_第7张图片

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

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

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

springboot解析@transaction注解原理_第8张图片

springboot解析@transaction注解原理_第9张图片

第三、总结

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

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

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

你可能感兴趣的:(spring,boot,java)