我们在spring boot环境下查看事务的原理,spring boot的核心是自动化配置,我们找到事务的自动化配置类:
该类的路径是:
默认情况下:org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration这个类是事务的自动化配置类。
这个类为我们配置了事务相关的类,在这个类之前要首先配置一个自动化配置类
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration
该类的核心是为我们配置了DataSourceTransactionManager类型的Bean transactionManager,里面设置了dataSource,dataSource是我们自己在代码中提供的bean,
回到TransactionAutoConfiguration这个类中
这个类的主要作用是配置transactionTemplate,和开启代理方式。我们要特别注意@EnableTransactionManagement这个注解
这个注解为我们导入了一个TransactionManagementConfigurationSelector类,该类将为我们返回一个配置类ProxyTransactionManagementConfiguration,来看一下这个类的结构
这个类的核心是为我们配置了BeanFactoryTransactionAttributeSourceAdvisor,这是AOP中要使用的类。
TransactionAttributeSource 这个是注解解释器,用来判断类和方法上是否有@Transactional注解
TransactionInterceptor 这个是事物切面
在这里再介绍一下AOP的实现,基于注解的AOP,功能的实现主要依靠这个
org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator.class类型的bean,该bean实现了BeanPostProcessor接口,在bean创建过程中为我们创建代理类。
这个类中会收集所有的 Advisor,自然也包括BeanFactoryTransactionAttributeSourceAdvisor。
我们来看一下Advisor生效的地方:
初步总结一下:
当我们引入事物相关的spring-tx.jar包后,位于spring-boot-autoconfigure.jar包下的事物的自动化配置类TransactionAutoConfiguration会生效,在这个类生效前生效的配置类DataSourceTransactionManagerAutoConfiguration会为我们配置好transactionManager,TransactionAutoConfiguration会为我们配置TransactionManagerCustomizers、TransactionTemplate类型的bean.在TransactionAutoConfiguration内部存在一个注解@EnableTransactionManagement,这个注解最终的作用是给我们引入了一个ProxyTransactionManagementConfiguration类型的配置类,这个配置类会为我们配置三个bean,分别是 TransactionInterceptor、TransactionAttributeSource、
BeanFactoryTransactionAttributeSourceAdvisor。BeanFactoryTransactionAttributeSourceAdvisor依赖于TransactionInterceptor、TransactionAttributeSource。
BeanFactoryTransactionAttributeSourceAdvisor的主要作用是利用AOP在有@Transactional注解的方法或者类上生成代理对象,在代理对象中使用TransactionInterceptor,对带有@Transcational注解的方法进行增强,就是添加事务。
下面我们来看一下TransactionInterceptor是如何对带有@Transactional注解的方法进行增强的:
TransactionInterceptor继承自TransactionAspectSupport,
TransactionInterceptor的invoke()方法最终调用的是TransactionAspectSupport.invokeWithinTransaction()
TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);创建事务
completeTransactionAfterThrowing(txInfo, ex);异常回滚事务
commitTransactionAfterReturning(txInfo);操作完成提交事务