文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Spring声明式事务注解的源码分析

2023-07-02 18:30

关注

本文小编为大家详细介绍“Spring声明式事务注解的源码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring声明式事务注解的源码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

1、@EnableTransactionManagement

@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(TransactionManagementConfigurationSelector.class)public @interface EnableTransactionManagement {

@EnableTransactionManagement 注解使用@Import 标签引入了TransactionManagementConfigurationSelector类,这个类又向容器中导入了两个重要的组件

Spring声明式事务注解的源码分析

2、加载事务控制组件

2.1、AutoProxyRegistrar

AutoProxyRegistrar 类的 registerBeanDefinitions ⽅法中⼜注册了⼀个组件

Spring声明式事务注解的源码分析

进入AopConfigUtils.registerAutoProxyCreatorIfNecessary 方法

Spring声明式事务注解的源码分析

发现最终,注册了⼀个叫做 InfrastructureAdvisorAutoProxyCreator 的 Bean,而这个类是AbstractAutoProxyCreator 的子类,实现了 SmartInstantiationAwareBeanPostProcessor 接口

public class InfrastructureAdvisorAutoProxyCreator extends AbstractAdvisorAutoProxyCreator
public abstract class AbstractAdvisorAutoProxyCreator extends AbstractAutoProxyCreator
public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware

继承体系结构图如下

Spring声明式事务注解的源码分析

它实现了SmartInstantiationAwareBeanPostProcessor,说明这是⼀个后置处理器,而且跟spring AOP 开启@EnableAspectJAutoProxy 时注册的 AnnotationAwareAspectJProxyCreator实

现的是同⼀个接口,所以说,声明式事务是 springAOP 思想的⼀种应用

2.2、ProxyTransactionManagementConfiguration 组件

@Configurationpublic class ProxyTransactionManagementConfiguration extends AbstractTransactionManagementConfiguration {    @Bean(name = TransactionManagementConfigUtils.TRANSACTION_ADVISOR_BEAN_NAME)    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)    public BeanFactoryTransactionAttributeSourceAdvisor transactionAdvisor() {// 事务增强器        BeanFactoryTransactionAttributeSourceAdvisor advisor = new BeanFactoryTransactionAttributeSourceAdvisor();// 向事务增强器中注⼊ 属性解析器 transactionAttributeSource        advisor.setTransactionAttributeSource(transactionAttributeSource());// 向事务增强器中注⼊ 事务拦截器 transactionInterceptor        advisor.setAdvice(transactionInterceptor());        if (this.enableTx != null) {            advisor.setOrder(this.enableTx.<Integer>getNumber("order"));        }        return advisor;    }    @Bean    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)// 属性解析器 transactionAttributeSource    public TransactionAttributeSource transactionAttributeSource() {        return new AnnotationTransactionAttributeSource();    }    @Bean    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)// 事务拦截器 transactionInterceptor    public TransactionInterceptor transactionInterceptor() {        TransactionInterceptor interceptor = new TransactionInterceptor();        interceptor.setTransactionAttributeSource(transactionAttributeSource());        if (this.txManager != null) {            interceptor.setTransactionManager(this.txManager);        }        return interceptor;    }}

ProxyTransactionManagementConfiguration是⼀个容器配置类,注册了⼀个组件transactionAdvisor,称为事务增强器,然后在这个事务增强器中又注入了两个属性:transactionAttributeSource,即属性解析器transactionAttributeSource 和 事务拦截器transactionInterceptor

属性解析器 AnnotationTransactionAttributeSource 部分源码如下

Spring声明式事务注解的源码分析

属性解析器有⼀个成员变量是annotationParsers,是⼀个集合,可以添加多种注解解析器(TransactionAnnotationParser),我们关注 Spring 的注解解析器,部分源码如下

Spring声明式事务注解的源码分析

属性解析器的作⽤之⼀就是⽤来解析@Transaction注解

TransactionInterceptor 事务拦截器,部分源码如下

Spring声明式事务注解的源码分析

Spring声明式事务注解的源码分析

2.3、上述组件如何关联起来的

2.4、invokeWithinTransaction⽅法

部分源码如下(关注1、2、3、4 标注处)

Spring声明式事务注解的源码分析

Spring声明式事务注解的源码分析

读到这里,这篇“Spring声明式事务注解的源码分析”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯