目录
第一步、全局搜索Transactional.class
第二步、查看哪里配置BeanFactoryTransactionAttributeSourceAdvisor
第四、SpringTransactionAnnotationParser是什么时候被注入的
第三、总结
先看一下@transaction的官网文档
16. Transaction Management
如下图所示,找到 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类,ctrl+f找到哪些地方调用该类,猜测是在ProxyTransactionManagementConfiguration类里。
点击进去果然验证猜想
这样就解释了@transaction是如何被springboot解析的。
直接给出结论:在 AnnotationTransactionAttributeSource初始化的时候初始化SpringTransactionAnnotationParser
1、springboot通过自动配置类ProxyTransactionManagementConfiguration, 设置@transaction的advisor(BeanFactoryTransactionAttributeSourceAdvisor)
2、BeanFactoryTransactionAttributeSourceAdvisor设置@transaction增强逻辑transactionInterceptor
3、在 AnnotationTransactionAttributeSource初始化的时候初始化SpringTransactionAnnotationParser。SpringTransactionAnnotationParser能判断一个类上是否有@transaction注解