当前位置: 首页 > news >正文

资阳网站建设 xiuweb合肥搜索引擎推广

资阳网站建设 xiuweb,合肥搜索引擎推广,厦门好景科技做网站,移动版网站怎么做Seata源码剖析-源码入口 Seata客户端启动 首先一个Seata的客户端启动一般分为几个流程: 自动加载各种Bean及配置信息初始化TM初始化RM(具体服务)初始化分布式事务客户端完成,代理数据源连接TC(Seata服务端&#xff…

Seata源码剖析-源码入口

Seata客户端启动

首先一个Seata的客户端启动一般分为几个流程:

  1. 自动加载各种Bean及配置信息
  2. 初始化TM
  3. 初始化RM(具体服务)
  4. 初始化分布式事务客户端完成,代理数据源
  5. 连接TC(Seata服务端),注册RM,注册TM
  6. 开启全局事务

在这个其中,就会涉及到几个核心的类型,首先我们需要来看配置类型GlobalTransactionAutoConfiguration

所以我们直接通过官方案例引入的Seata包,找到SpringBoot项目在启动的时候自动扫描加载类型的spring.factories,然后找到GlobalTransactionAutoConfiguration(Seata自动配置类)

全局事务扫描类源码

这个类型的核心点,就是加载配置,注入相关的Bean

/*** seata自动配置类*/
@Configuration
@EnableConfigurationProperties(SeataProperties.class)
public class GlobalTransactionAutoConfiguration {private final ApplicationContext applicationContext;private final SeataProperties seataProperties;public GlobalTransactionAutoConfiguration(ApplicationContext applicationContext,SeataProperties seataProperties) {this.applicationContext = applicationContext;this.seataProperties = seataProperties;}// 注入全局事务扫描器@Beanpublic GlobalTransactionScanner globalTransactionScanner() {String applicationName = applicationContext.getEnvironment().getProperty("spring.application.name");String txServiceGroup = seataProperties.getTxServiceGroup();if (StringUtils.isEmpty(txServiceGroup)) {txServiceGroup = applicationName + "-fescar-service-group";seataProperties.setTxServiceGroup(txServiceGroup);}// 构建全局扫描器,传入参数:应用名、事务分组名,失败处理器return new GlobalTransactionScanner(applicationName, txServiceGroup);}
}

GlobalTransactionScanner全局事务扫描器

在这其中我们要关心的是GlobalTransactionScanner这个类型,这个类型扫描@GlobalTransactional注解,并对代理方法进行拦截增强事务的功能。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UqM1hMcB-1676379765831)(image-20220221231318290.png)]

这里给大家展示了当前GlobalTransactionScanner的类关系图,其中我们现在继承了Aop的AbstractAutoProxyCreator类型,在这其中有一个重点方法,其实这个方法就是判断Bean对象是否需要代理,是否需要增强

protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {if (beanName != null && this.targetSourcedBeans.contains(beanName)) {return bean;}if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {return bean;}if (isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName)) {this.advisedBeans.put(cacheKey, Boolean.FALSE);return bean;}// Create proxy if we have advice.Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);if (specificInterceptors != DO_NOT_PROXY) {this.advisedBeans.put(cacheKey, Boolean.TRUE);Object proxy = createProxy(bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));this.proxyTypes.put(cacheKey, proxy.getClass());return proxy;}this.advisedBeans.put(cacheKey, Boolean.FALSE);return bean;
}

当然这是父类提供的方法,那子类继承之后重写此方法,完成了定制化的效果,定义不同的代理对象

@Override
protected Object wrapIfNecessary(奈色色瑞)(Object bean, String beanName, Object cacheKey) {try {// 加锁防止并发synchronized (PROXYED_SET) {if (PROXYED_SET.contains(beanName)) {return bean;}interceptor = null;//check TCC proxy// 检查是否是TCC模式if (TCCBeanParserUtils.isTccAutoProxy(bean, beanName, applicationContext)) {//TCC interceptor, proxy bean of sofa:reference/dubbo:reference, and LocalTCC// 如果是:添加TCC拦截器interceptor = new TccActionInterceptor(TCCBeanParserUtils.getRemotingDesc(beanName));ConfigurationCache.addConfigListener(ConfigurationKeys.DISABLE_GLOBAL_TRANSACTION,(ConfigurationChangeListener)interceptor);} else {// 不是TCC模式Class<?> serviceInterface = SpringProxyUtils.findTargetClass(bean);Class<?>[] interfacesIfJdk = SpringProxyUtils.findInterfaces(bean);// 判断是否有相关事务注解,如果没有就不代理if (!existsAnnotation(new Class[]{serviceInterface})&& !existsAnnotation(interfacesIfJdk)) {return bean;}// 当发现存在全局事务注解标注的Bean,添加拦截器if (globalTransactionalInterceptor == null) {// 添加拦截器globalTransactionalInterceptor = new GlobalTransactionalInterceptor(failureHandlerHook);ConfigurationCache.addConfigListener(ConfigurationKeys.DISABLE_GLOBAL_TRANSACTION,(ConfigurationChangeListener)globalTransactionalInterceptor);}interceptor = globalTransactionalInterceptor;}LOGGER.info("Bean[{}] with name [{}] would use interceptor [{}]", bean.getClass().getName(), beanName, interceptor.getClass().getName());// 检查是否是代理对象if (!AopUtils.isAopProxy(bean)) {// 不是调用Spring代理(父级)bean = super.wrapIfNecessary(bean, beanName, cacheKey);} else {// 已经是代理对象,反射获取代理类中的已经存在的拦截器组合,然后添加到该集合当中AdvisedSupport advised = SpringProxyUtils.getAdvisedSupport(bean);Advisor[] advisor = buildAdvisors(beanName, getAdvicesAndAdvisorsForBean(null, null, null));for (Advisor avr : advisor) {advised.addAdvisor(0, avr);}}// 将Bean添加到Set中PROXYED_SET.add(beanName);return bean;}} catch (Exception exx) {throw new RuntimeException(exx);}
}
http://www.khdw.cn/news/43617.html

相关文章:

  • .net做的学校网站资源猫
  • 关于购物网站开发的开题报告seo优化有百度系和什么
  • 自己搭建网站怎么搭建微信推广朋友圈广告
  • wordpress实现静态化网站的seo方案
  • 网站建设ihuibest微信指数查询入口
  • 如何做测评视频网站排行榜软件
  • 网站建设实务课本快速排名优化seo
  • 衡阳网站建设步骤东莞推广平台有哪些
  • 网站开发的工作经验要求百度网站推广教程
  • 怎么做网站官方电话外贸seo优化公司
  • 南宁模板建站平台网站名称查询
  • 长沙营销网站建设百度收录网站入口
  • 室内设计师网上培训班类聚seo
  • 小区物业管理系统seo公司推广
  • 北京南昌企业网站制作小红书怎么推广
  • 自己可以做网站么排名第一的玉米品种
  • 承德优化网站建设建站公司网站建设
  • wordpress 活动插件青岛网络优化代理
  • 北京矿建建设集团有限公司网站广州各区风险区域最新动态
  • 个旧做网站哪家公司好网络营销讲师
  • 长春 网站建设有哪些网站可以免费发布广告
  • 网站年费佛山做seo推广公司
  • 郑州品牌网站建设北京seo外包 靠谱
  • 西安专业网站建设站长推荐入口自动跳转
  • 安阳网站设计哪家专业关键词制作软件
  • 网站隐藏的案例怎么看济宁网站建设
  • 女人与狗做网站重庆专业seo
  • 珠海网站建设网站全网营销外包
  • 东莞网站建设(信科网络)百度小说排行榜2021
  • 商城管理西安seo顾问公司