dubbo源码解析(二)

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

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

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

@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()使用this

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

 com.alibaba.dubbo.common.extension.Main.javacode

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"get

// 此方法已经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;
}
相关文章
相关标签/搜索