@Enable*注解的应用之:声明式事务@EnableTransactionManagement详解
SpringAOP应用之声明式事务中案例简明示范了声明式事务的使用,那么为什么@EnableTransactionManagement和@Transactional进行了相关的配置,就替代了aop复杂的xml配置呢?
@EnableXXX一类的注解在Spring高级特性之三:@Enable*注解的工作原理 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中有通用详解。
很显然@EnableTransactionManagement属于Spring高级特性之三:@Enable*注解的工作原理第二种通过条件选择加载配置来控制事务的管理。通过TransactionManagementConfigurationSelector类中的注释——Selects which implementation of {@link AbstractTransactionManagementConfiguration},可以理解选择实现了AbstractTransactionManagementConfiguration类的配置进行Bean的加载。
ProxyTransactionManagementConfiguration实现了AbstractTransactionManagementConfiguration类:
通过该类加载了上图中相关的bean。这三个方法是不是很熟悉:
1、transactionAdvisor(): 这个方法用于创建 BeanFactoryTransactionAttributeSourceAdvisor 对象,作为事务的Advisor(通知器)。Advisor定义了在哪些切点上应用事务逻辑。该方法接收两个参数:transactionAttributeSource(事务属性源)和 transactionInterceptor(事务拦截器)。它将这两个对象设置到创建的 BeanFactoryTransactionAttributeSourceAdvisor 中,并根据需要设置Advisor的顺序。
2、transactionAttributeSource(): 这个方法用于创建 AnnotationTransactionAttributeSource 对象,作为管理事务属性的事务属性源。AnnotationTransactionAttributeSource 是一个基于注解的事务属性源,用于从标注了事务注解的方法获取事务属性信息。
3、transactionInterceptor(): 这个方法用于创建 TransactionInterceptor 对象,作为事务的拦截器。TransactionInterceptor 是一个AOP拦截器,用于在方法调用前后应用事务逻辑。它接收一个 transactionAttributeSource 参数,用于获取事务属性信息。如果配置了 txManager(事务管理器),则将其设置到创建的 TransactionInterceptor 中。
是不是AOP的逻辑?显然注解方式实现了xml配置化的aop,方便了开发者的工作。所以通过@EnableTransactionManagement,可以开启对事务的AOP代理。
还有两个问题:1)加载哪个事务管理器;2)对哪些方法或者类进行事务管理。
加载事务,通过调试:
识别@Transactional,获取TransactionManager Bean:
获取TransactionManager :
之后保存在transactionManagerCache中:
之后将根据条件判断是否需要将事务织入到方法中并执行,跟踪代码事务API由PlatformTransactionManager接口提供:
关于PlatformTransactionManager及相关内容后续分享,本文重点在于@Enable**选择加载配置完成声明式事务。