public T getExtension(String name){if(StringUtils.isEmpty(name)){//名称为空thrownewIllegalArgumentException("Extension name == null");}if("true".equals(name)){//加载默认的扩展实现 如果name=true//1.getDefaultExtensionreturngetDefaultExtension();}//2.getOrCreateHolder//getOrCreateHolder()方法中封装了查找cachedInstances缓存的逻辑//获取当前类的holder,实现原理和cachedClasses的方式相同,都是建立同一个引用后再进行加锁final Holder<Object> holder =getOrCreateHolder(name);
Object instance = holder.get();//double-check防止并发问题if(instance == null){synchronized(holder){
instance = holder.get();if(instance == null){//根据扩展名从SPI配置文件中查找对应的扩展实现类//3.根据名称创建扩展实现,放放Holder
instance =createExtension(name);
holder.set(instance);}}}return(T) instance;}
getDefaultExtension
public T getDefaultExtension(){//获取扩展类 这里会走最开始的构造流程getExtensionClasses();if(StringUtils.isBlank(cachedDefaultName)||"true".equals(cachedDefaultName)){return null;}returngetExtension(cachedDefaultName);}