1.Spring事务处理的基本过程:
Spring事务处理主要分以下三个主要的过程:
(1).读取和处理在Spring IoC容器中配置的事务处理属性,并转化为Spring事务处理所需要的内部数据结构。
(2).Spring事务处理模块实现的统一的事务处理过程。这个通用的事务处理过程包括:处理事务配置属性;事务配置属性与线程绑定等。
(3).底层事务处理实现。Spring中底层事务处理的实现交由PlatformTransactionManager的具体实现类来实现,如DataSourceTransactionManager和HibernateTransactionManager等。
接下来,将分三篇文章分别针对Spring事务处理这三个过程进行源码分析,本文首先分析读取和处理在Spring IoC容器中配置的事务处理属性的过程。
2.Spring管理事务处理的IoC容器—TransactionProxyFactoryBean:
TransactionProxyFactoryBean是Spring中管理事务的IoC容器,它通过Spring的AOP功能来完成事务管理配置。TransactionProxyFactoryBean为Spring的事务处理的实现做准备工作,包括配置AOP的拦截器、通知器;同时向TransactionProxyFactoryBean注入事务处理器和事务处理属性等。TransactionProxyFactoryBean源码如下:
[java] view plaincopyprint public class TransactionProxyFactoryBean extends AbstractSingletonProxyFactoryBean implements BeanFactoryAware { //通过AOP发挥作用的事务拦截器 private final TransactionInterceptor transactionInterceptor = new TransactionInterceptor(); //事务的AOP切入点 private Pointcut pointcut; //通过Spring IoC容器依赖注入的PlatformTransactionManager事务管理器 public void setTransactionManager(PlatformTransactionManager transactionManager) { this.transactionInterceptor.setTransactionManager(transactionManager); } //通过依赖注入设置事务属性,以Properties形式存放的事务属性的key是方法名, //value是事务属性描述 public void setTransactionAttributes(Properties transactionAttributes) { this.transactionInterceptor.setTransactionAttributes(transactionAttributes); } //通过依赖注入设置事务属性源,通过事务属性源可以找到需要使用的事务属性 public void setTransactionAttributeSource(TransactionAttributeSource transactionAttributeSource) { this.transactionInterceptor.setTransactionAttributeSource(transactionAttributeSource); } //通过依赖注入设置事务切入点,事务切入点根据触发条件调用事务拦截器 public void setPointcut(Pointcut pointcut) { this.pointcut = pointcut; } //为事务拦截器设置管理事务的容器 public void setBeanFactory(BeanFactory beanFactory) { this.transactionInterceptor.setBeanFactory(beanFactory); } //创建Spring AOP事务处理的通知器Advisor protected Object createMainInterceptor() { //调用事务拦截器的方法,检查必需的属性是否设置 this.transactionInterceptor.afterPropertiesSet(); //如果在Spring配置中设置了事务切入点 if (this.pointcut != null) { //使用Spring默认的通知器封装事务切入点和事务拦截器 return new DefaultPointcutAdvisor(this.pointcut, this.transactionInterceptor); } //如果在Spring配置中没有设置事务切入点 else { //使用TransactionAttributeSourceAdvisor封装默认的事务切入点 return new TransactionAttributeSourceAdvisor(this.transactionInterceptor); } } }