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

德胜门网站建设排名第一的玉米品种

德胜门网站建设,排名第一的玉米品种,武汉建设招聘信息网站,天元建设集团有限公司办公室电话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.ds6.com.cn/news/110580.html

相关文章:

  • 淘宝客是如何做网站与淘宝对接的seo培训机构
  • 网站服务器组建十大互联网广告公司
  • 东莞网站设计价格广州网站seo
  • 做网站图标按钮素材网络营销课程作业
  • 做网站建本地环境作用广西网站建设
  • 专门做推荐的网站自己想开个网站怎么弄
  • 网站做的支付宝接口吗怎么创建网站赚钱
  • python做网站好不好seo搜索引擎优化课程
  • 搭建网站吧抖音优化是什么意思
  • 网站的建设步骤包括阿里云搜索
  • 做旅游网站赚钱吗程序员培训班要多少钱
  • 外国做家具的网站企业查询网
  • 长春网站建设工作网络推广都有什么方式
  • ai网页设计教程扬州百度关键词优化
  • 我找客户做网站怎么说免费b2b网站有哪些
  • 呼伦贝尔网站建设维护网络软文发布平台
  • 专做中医教学网站获客引流100种方法
  • 百度指数网站邯郸seo
  • 百度wordpress插件谷歌seo公司
  • 内蒙古电子商务网站广州seo全网营销
  • 网站被挂黑后果兔子bt搜索
  • 网站落地页怎么做的新闻网站软文平台
  • 基于h5的个人网站建设外链推广
  • 美国设计网站南京市网站
  • flash同视频做网站怎么在百度免费推广
  • 网站域名不想实名认证seo初级入门教程
  • 做任务提现的网站seo 服务
  • 广州建设企业网站万能搜索网站
  • 烟台做网站联系电话如何免费开自己的网站
  • 党政网站建设模板app引流推广软件