//获得类型对应的Loader public static <S> ExtensionLoader<S>getExtensionLoader(Class<S> type)//前面一个S表示这个泛型方法的泛型参数类型是S { if (type == null) { throw new IllegalArgumentException("Extension type should not be null."); } if (!type.isInterface()) { throw new IllegalArgumentException("Extension type must be an interface.");//必须是个接口,你联系策略模式理解 } if (type.getAnnotation(SPI.class) == null) { throw new IllegalArgumentException("Extension type must be annotated by @SPI");//必须有SPI注解 } ExtensionLoader<S> extensionLoader=(ExtensionLoader<S>) EXTENSIONLOADER_LOADERS.get(type);//从map里面获得 //如果没有就加入 if(extensionLoader==null) { EXTENSIONLOADER_LOADERS.putIfAbsent(type,new ExtensionLoader<S>(type)); extensionLoader = (ExtensionLoader<S>) EXTENSION_LOADERS.get(type); } return extensionLoader; }
getExtension
获得扩展,在没有实例的情况下调用了create方法
public T getExtension(String name)//其实是从局部换成里面寻找 { if(StringUtil.isBlank(name)) { throw new IllegalArgumentException("Extension name should not be null or empty."); } Holder<Object> holder = cachedInstances.get(name);//检查局部缓存里面是不是有了,没有就创造然后put if(holder==null) { cachedInstances.put(name,new Holder<>()); holder=cachedInstances.get(name); } Object instance=holder.get(); //单例模式 if (instance == null) { synchronized (holder) { instance = holder.get(); if (instance == null) { instance = createExtension(name);//调用方法从全局缓存里面找 holder.set(instance);//放到局部缓存里 } } } return (T)instance; }
createExtension
虽然名字是create,但是真实逻辑是先从全局缓存找,没有才去创键
private T createExtension(String name)//创建扩展实例 { Class<?> clazz = getExtensionClasses().get(name);//这个方法后面细说 if (clazz == null) { throw new RuntimeException("No such extension of name " + name); } T instance = (T) EXTENSION_INSTANCES.get(clazz);//获取实例 if(instance==null) { try { EXTENSION_INSTANCES.putIfAbsent(clazz, clazz.newInstance()); instance = (T) EXTENSION_INSTANCES.get(clazz); } catch (Exception e) { log.error(e.getMessage()); } } return instance; }