我是靠谱客的博主 留胡子早晨,最近开发中收集的这篇文章主要介绍seata源码解析:seata和spring是如何整合的?,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

请添加图片描述

介绍

在seata低版本中,seata需要用户自己配置数据源代理,并且在resources目录下放2个文件,file.conf和registry.conf。

其中file.conf配置了数据存储模式,registry.conf配置了注册中心的信息

在最新的版本中,seata新增了一个seata-spring-boot-starter模块,让我们可以将数据存储模式和注册中心定义在application.yaml中,并且可以通过Enable注解开始数据源自动代理。

因为我之前的Demo都是基于seata-spring-boot-starter搭建的,所以本节我们就来看一下seata-spring-boot-starter注入了哪些重要的Bean。

按照spring-boot-starter模块的常规套路,直接找spring.factories文件
在这里插入图片描述

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
io.seata.spring.boot.autoconfigure.SeataPropertiesAutoConfiguration,
io.seata.spring.boot.autoconfigure.SeataDataSourceAutoConfiguration,
io.seata.spring.boot.autoconfigure.SeataAutoConfiguration,
io.seata.spring.boot.autoconfigure.HttpAutoConfiguration

请添加图片描述

SeataPropertiesAutoConfiguration

public class SpringApplicationContextProvider implements ApplicationContextAware, BeanFactoryPostProcessor {
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ObjectHolder.INSTANCE.setObject(OBJECT_KEY_SPRING_APPLICATION_CONTEXT, applicationContext);
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { }
}

而SpringApplicationContextProvider继承了ApplicationContextAware用来获取ApplicationContext,后续就可以从ApplicationContext中获取对象

BeanFactoryPostProcessor接口是用来修改bean的创建方式的,目前方法没有任务实现

SeataDataSourceAutoConfiguration

seata的at和xa模式是基于数据源代理实现的,而SeataDataSourceAutoConfiguration帮助我们对数据源实现了自动代理,不用手动代理。
在这里插入图片描述
各个部分的代理对象的作用以及生效场景如下
请添加图片描述

SeataAutoConfiguration

GlobalTransactionScanner是一个非常重要的类,这个类中会启动RM和TM客户端,并且对加了@GlobalTransactional,@GlobalLock,@TwoPhaseBusinessAction注解的类生成代理对象

FailureHandler是一个失败任务处理类,目前唯一的实现是DefaultFailureHandlerImpl,并没有做任何额外的操作,只是在任务失败时,打印相关的日志。当然你可以重写一下FailureHandler,比如当失败发生时发送邮件或者钉钉

HttpAutoConfiguration

HttpAutoConfiguration这个类主要是用在应用通过http调用时,传递xid。

拦截器TransactionPropagationInterceptor:从请求中名为TX_XID的head中取出xid的值(因为上游在调用的时候会把xid放在head中),并把这个xid放到RootContext中
异常处理器HttpHandlerExceptionResolver:当调用http请求发生异常时,将xid从RootContext中删除

参考博客

[1]https://segmentfault.com/a/1190000039332011
客户端启动
[2]https://www.cnblogs.com/jackion5/p/14788377.html

最后

以上就是留胡子早晨为你收集整理的seata源码解析:seata和spring是如何整合的?的全部内容,希望文章能够帮你解决seata源码解析:seata和spring是如何整合的?所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部