2019独角兽企业重金招聘Python工程师标准>>>
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;
}