应用事务步骤:
1)配置类上添加注解@EnableTransactionManagement开启事务;
2)事务方法上添加注解:@Transactional;
3)将事务管理器注册到容器中;
原理:
1)@EnableTransactionManagement:利用TransactionManagementConfigurationSelector(xxxselector会返回组件的全类名)给容器导入两个组件;
AutoProxyRegistrar和ProxyTransactionManagementConfiguration;
2)AutoProxyRegistrar组件:(registerBeanDefinitions())做了什么?---- 给容器中注册一个组件:InfrastructureAdvisorAutoProxyCreator;是一个后置处理器;
代码如下:
它利用后置处理器机制在对象创建以后,包装对象并返回一个包含增强器的代理对象,代理对象执行方法利用拦截器链进行调用。
3)ProxyTransactionManagementConfiguration组件;做了什么?-----是一个配置类,利用@Bean给容器注册各种组件;
给容器中注册事务增强器(BeanFactoryTransactionAttributeSourceAdvisor);
a)事务增强器需要事务注解的参数信息,AnnotationTransactionAttributeSource解析事务注解;
b)事务拦截器:
TransactionInterceptor:保存了事务属性信息,事务管理器;
public class TransactionInterceptor extends TransactionAspectSupport implements MethodInterceptor, Serializable {}
他是一个MethodInterceptor(方法拦截器);
在目标方法执行的时候执行拦截器链;事务拦截器:
1)先获取事务相关的属性;
2)在获取PlatformTransactionManager,如果事先没有添加任何指定的transactionmanager,最终会从容器中按照类型获取一个PlatformTransactionManager;
3)执行目标方法
如果有异常,获取到事务管理器,利用事务管理回滚操作;
如果正常,利用事务管理器,提交事务。