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;
}
相關文章
相關標籤/搜索