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; }