前面介绍了事务的使用方法,开启事务可以通过@EnableTransactionManagement或者<tx:annotation-driven />,前面说过spring的事务实现是基于AOP实现的,下面分析下spring事务的实现原理
@EnableTransactionManagement
和AOP类似,开启事务注解使用了bean导入注解@Import,通过ImportSelector方式导入bean;实现类为TransactionManagementConfigurationSelector
在代理模式mode=AdviceMode.PROXY时,指定通过AutoProxyRegistrar和ProxyTransactionManagementConfiguration方式导入bean
AutoProxyRegistrar
该类为ImportBeanDefinitionRegistrar接口的实现类,用于动态注册bean定义,跟踪源码,找到其动态注册了InfrastructureAdvisorAutoProxyCreator类型的bean
InfrastructureAdvisorAutoProxyCreator为bean后置处理器,在postProcessAfterInitialization方法中创建代理对象
ProxyTransactionManagementConfiguration
该类为spring配置类,主要注册了如下三种bean定义:
1、AnnotationTransactionAttributeSource
用于扫描使用@Transactional注解的方法,并读取事务配置getTransactionAttribute方法,如事务传播行为、隔离级别等
2、TransactionInterceptor
spring事务中很重要的类,提供了事务执行的方式, invoke方法;并且注入了事务管理器属性;
执行流程
3、BeanFactoryTransactionAttributeSourceAdvisor
Advisor实现类,遵从Advisor规范,在代理调用时,调用该类的增强方法getAdvice;该类注入了TransactionInterceptor,因此会先使用TransactionInterceptor进行增强;
XML配置方式事务原理
前面的AOP和事务都是以注解的方式进行说明的,这里说明下XML方式的原理;
spring中解析XML定义都是通过NameSpaceHandler来解析的,spring事务通过TxNameSpaceHandler来解析