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

dubbo源码解析(二)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

com.alibaba.dubbo.common.extension.Main.java //Dubbo使用的扩展点获取

private static final ExtensionLoader<Container> loader = ExtensionLoader.getExtensionLoader(Container.class);

传入的Container类有@SPI注解,注解值为spring

@SPI("spring")
public interface Container {
  void start();
  void stop();
}

getExtensionLoader()新建了一个ExtensionLoader对象,new ExtensionLoader<T>(Contaniner.class)

public static <T> ExtensionLoader<T> getExtensionLoader(Class<T> type) {
  ...
  ExtensionLoader<T> loader = (ExtensionLoader<T>) EXTENSION_LOADERS.get(type);
  if (loader == null) {
    EXTENSION_LOADERS.putIfAbsent(type, new ExtensionLoader<T>(type));
    loader = (ExtensionLoader<T>) EXTENSION_LOADERS.get(type);
  }
  return loader;
}

ExtensionLoader构造函数中,将传入参数Contaniner.class赋值给type属性,供getDefaultExtensionName()使用

private ExtensionLoader(Class<?> type) {
  this.type = type;
  objectFactory = (type == ExtensionFactory.class ? null : ExtensionLoader.getExtensionLoader(ExtensionFactory.class).getAdaptiveExtension());
}

 com.alibaba.dubbo.common.extension.Main.java

public static void main(String[] args) {
  if (args == null || args.length == 0) {
    String config = ConfigUtils.getProperty(CONTAINER_KEY, loader.getDefaultExtensionName());
    args = Constants.COMMA_SPLIT_PATTERN.split(config);
  }
}

 

/**
 * 返回缺省的扩展点名,如果没有设置缺省则返回<code>null</code>。
 */
public String getDefaultExtensionName() {
	getExtensionClasses();
	return cachedDefaultName;
}

cachedDefaultName属性通过loadExtensionClasses()方法获得

private Map<String, Class<?>> getExtensionClasses() {
    Map<String, Class<?>> classes = cachedClasses.get();
	classes = loadExtensionClasses();
	return classes;
}

通过Contaniner.class的@SPI("spring")获得cachedDefaultName = "spring"

// 此方法已经getExtensionClasses方法同步过。
private Map<String, Class<?>> loadExtensionClasses() {
	final SPI defaultAnnotation = type.getAnnotation(SPI.class);
	if (defaultAnnotation != null) {
		if (names.length == 1) 
          cachedDefaultName = names[0]; //cachedDefaultName = "spring", Container.class @SPI("spring")
	}
	Map<String, Class<?>> extensionClasses = new HashMap<String, Class<?>>();
	return extensionClasses;
}

 

转载于:https://my.oschina.net/u/3135467/blog/805066

相关文章:

  • 在VMW 虚拟桌面环境下 VC总是提示 计算虚拟磁盘空间
  • RH413-RHEL6.4课程总结
  • 摄像机成像模型
  • mybatis 获取insert返回的主键
  • 15索引器
  • (七)理解angular中的module和injector,即依赖注入
  • zzz
  • JS中获取session中传过来的值对象
  • python笔记正则表达式
  • CentOS6下yum搭建LNMP环境
  • testng入门教程9 TestNG依赖测试
  • Mysql安装出现=========== install/remove of the Service Denied
  • 扫码登陆 之我见
  • mongo索引构建
  • 自己用的空气指数实时图的爬虫
  • Android 控件背景颜色处理
  • create-react-app做的留言板
  • GraphQL学习过程应该是这样的
  • Hibernate【inverse和cascade属性】知识要点
  • js继承的实现方法
  • Service Worker
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • Spark RDD学习: aggregate函数
  • 程序员该如何有效的找工作?
  • 翻译:Hystrix - How To Use
  • ------- 计算机网络基础
  • 前端性能优化--懒加载和预加载
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 删除表内多余的重复数据
  • 我感觉这是史上最牛的防sql注入方法类
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 中文输入法与React文本输入框的问题与解决方案
  • ionic入门之数据绑定显示-1
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • #DBA杂记1
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (5)STL算法之复制
  • (Java数据结构)ArrayList
  • (ros//EnvironmentVariables)ros环境变量
  • (差分)胡桃爱原石
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (理论篇)httpmoudle和httphandler一览
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (算法)Travel Information Center
  • (转)重识new
  • .dwp和.webpart的区别
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .net流程开发平台的一些难点(1)
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • @DataRedisTest测试redis从未如此丝滑
  • [android] 请求码和结果码的作用
  • [Angular] 笔记 7:模块