《Spring技术内幕》学习笔记14——Spring读取和处理事务配置
1.Spring事务处理的基本过程:Spring事务处理主要分以下三个主要的过程:(1).读取和处理在Spring IoC容器中配置的事务处理属性,并转化为Spring事务处理所需要的内部数据结构。(2).Spring事务处理模块实现的统一的事务处理过程。这个通用的事务处理过程包括:处理事务配置属性;事务配置属性与线程绑定等。(3).底层事务处理实现。Spring中底层事务处理的实
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源码如下:
通过上面对TransactionProxyFactoryBean的源码分析,我们看到,Spring的事务处理IoC容器TransactionProxyFactoryBean中主要通过依赖注入完成事务切入点和事务拦截器的配置,最重要的功能是通过createMainInterceptor()方法为事务切入点和事务拦截器创建AOP事务通知器。
TransactionProxyFactoryBean继承了AbstractSingletonProxyFactoryBean类,作为Spring事务管理IoC容器,其getObject()方法和IoC容器初始化完成之后回调的afterPropertiesSet()方法均是在其父类AbstractSingletonProxyFactoryBean中实现的,我们接下来分析AbstractSingletonProxyFactoryBean中事务处理相关源码的实现。
3.AbstractSingletonProxyFactoryBean创建配置事务:
AbstractSingletonProxyFactoryBean实现了FactoryBean和InitializingBean接口,Spring IoC容器最核心的getObject()和afterPropertiesSet()方法均是在该类中实现,AbstractSingletonProxyFactoryBean创建和配置事务相关的方法源码如下:
通过上面对AbstractSingletonProxyFactoryBean创建和配置事务代理对象相关源码分析我们看到,当Spring事务IoC容器初始化完成之后,事务容器回调afterPropertiesSet()方法创建事务AOP代理对象。
4.TransactionAttributeSourceAdvisor读取Spring事务处理配置:
在2对TransactionProxyFactoryBean源码分析中,创建Spring事务的核心方法createMainInterceptor()中,根据给定的事务拦截器创建事务属性源通知器TransactionAttributeSourceAdvisor,事务属性源通知器的核心源码如下:
通过对事务属性源通知器TransactionAttributeSourceAdvisor的核心源码分析我们可以看到,事务属性源通知器的核心功能是为Spring的事务IoC容器设置事务属性源切入点和事务拦截器。
5.事务切入点TransactionAttributeSourcePointcut匹配事务配置规则:
事务切入点TransactionAttributeSourcePointcut在事务属性源通知器中作为匿名内部类,用于根据事务的配置匹配符合规则的方法,事务切入点的核心源码如下:
事务属性源TransactionAttributeSource在事务拦截器TransactionInterceptor的父类事务切面支持TransactionAspectSupport中配置,源码如下:
Spring默认使用名称匹配事务属性源NameMatchTransactionAttributeSource读取和匹配事务属性。
6.NameMatchTransactionAttributeSource读取和匹配事务属性:
名称匹配属性属性源从事务处理属性配置中读取事务的方法名和配置属性值,将得到的事务方法名和属性值保存到一个Map集合中,方法名作为key,事务属性值作为value。名称匹配事务属性源主要源码如下:
名称匹配事务属性源NameMatchTransactionAttributeSource主要在两个阶段发挥作用,在Spring事务IoC容器对事务配置读取解析时,事务容器调用名称匹配事务属性源的setProperties和addTransactionalMethod方法将方法名称和事务属性添加到Map集合中,当方法调用时,通过getTransactionAttribute方法获取方法所配置的事务属性。
7.事务拦截器TransactionInterceptor的实现:
通过前面2到6的分析,管理Spring事务的IoC容器TransactionProxyFactoryBean已经完成了事务配置的读取,设置好了事务拦截器和切入点。当应用调用被配置事务的方法时,首先通过getObject方法向Spring事务管理容器索取被被管理方法的事务属性,触发调用事务拦截器的拦截方法进行事务处理。
在对Spring AOP源码分析中关于AOP代理如何起作用时,我们知道Spring的AOP代理通过invoke回调方法对切入点方法进行拦截处理,这个invoke方法是AOP联盟的方法拦截器MethodInterceptor接口中定义的方法,用于对AOP代理对象的方法进行包装处理。事务拦截器TransactionInterceptor正是通过这个invoke拦截方法实现事务的拦截处理,源码如下:
通过上面对事务拦截器的拦截方法源码分析,我们可以看到Spring事务处理的基本工作流程:
(1).在调用方法时首先获取方法的事务属性配置,根据方法事务属性配置创建事务,获取Spring事务容器配置的事务处理器。
(2).调用具体的事务处理器对事务进行具体的处理。
(3).根据事务处理结果和事务处理过程中产生异常等进行提交或者回滚等处理。
事务拦截处理器TransactionInterceptor的invoke方法为Spring事务处理搭建一个通用的处理流程。
更多推荐
所有评论(0)