Spring注解开发——38、声明式事务-源码分析
总结:和AOP原理一样
1、@EnableTransactionManagement
利用TransactionManagementConfigurationSelector给容器中会导入组件
导入两个组件
- AutoProxyRegistrar
- ProxyTransactionManagementConfiguration
2、AutoProxyRegistrar
- 给容器中注册一个 InfrastructureAdvisorAutoProxyCreator 组件;
- InfrastructureAdvisorAutoProxyCreator:?
- 利用后置处理器机制在对象创建以后,包装对象,返回一个代理对象(增强器),代理对象执行方法利用拦截器链进行调用;
3、ProxyTransactionManagementConfiguration 做了什么?
给容器中注册事务增强器;
- 事务增强器要用事务注解的信息,AnnotationTransactionAttributeSource解析事务注解
- 事务拦截器:
- TransactionInterceptor;保存了事务属性信息,事务管理器;
- 他是一个 MethodInterceptor;
- 在目标方法执行的时候;执行拦截器链;事务拦截器:
- 先获取事务相关的属性
- 再获取PlatformTransactionManager,如果事先没有添加指定任何transactionmanger 最终会从容器中按照类型获取一个PlatformTransactionManager;
- 执行目标方法
- 如果异常,获取到事务管理器,利用事务管理回滚操作;
- 如果正常,利用事务管理器,提交事务
1、 @EnableTransactionManagement
因为adviceMode默认是PROXY,所以@EnableTransactionManagement利用TransactionManagementConfigurationSelector组件给我们向容器注入了AutoProxyRegistrar和ProxyTransactionManagementConfiguration组件
2 AutoProxyRegistrar
AutoProxyRegistrar实现了ImportBeanDefinitionRegistrar接口重写registerBeanDefinitions()方法会手动像容器中注册组件
跟源码,发现给我们手动注册了InfrastructureAdvisorAutoProxyCreator这个组件,这个组件又是做什么的呢?我们继续看源代码
最后发现InfrastructureAdvisorAutoProxyCreator implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware。这说明InfrastructureAdvisorAutoProxyCreator这组件其实就是一个InstantiationAwareBeanPostProcessor后置处理器,会在所有bean初始化之后拦截,判断当前bean是否需要增强,如果需要的话,那么给其包装成一个代理对象。当使用这个bean的方法的时候,代理对象会拦截进行功能增强。好了,我们知道@EnableTransactionManagement注解给我们注册的AutoProxyRegistrar这个组件是给我们注册了InfrastructureAdvisorAutoProxyCreator这个组件,并且知道了其作用。下面我们看一下@EnableTransactionManagement给我们注册的另外一个组件ProxyTransactionManagementConfiguration的作用
3 ProxyTransactionManagementConfiguration
我们看到ProxyTransactionManagementConfiguration就是个配置类,给我们向容器注册了BeanFactoryTransactionAttributeSourceAdvisor这个事务增强器,BeanFactoryTransactionAttributeSourceAdvisor设置了TransactionAttributeSource和TransactionInterceptor这两个属性
3.1 TransactionAttributeSource的作用
3.2 TransactionInterceptor的作用
我们发现TransactionInterceptor实现了MethodInterceptor接口,那么在执行目标方法的时候,会被执行拦截器链
,执行到这个事务拦截器会做一下操作