框架设计灵活,可扩展,给用户带来极大的便利。如果业务有新的变化,用新的实现替换之前的实现就行了,我们也知道怎么加载框架。不用太在意,显然这对我们开发者是很友好的。java中的SPI也是这个思路,dubbo中的SPI也是这个思路。java中的spi不够灵活,因为会一次性执行扩展点逻辑,所以这里就不展开了(可以参考javaspi),这里重点介绍dubbo中的SPI。使用方法一,根据接口全路径名在META-INF/services目录下创建文件,文件内容为key=value形式2、ExtensionLoader.getExtensionLoader(xxx.class).getExtension("key")这样我们就可以得到我们的自定义实现。实现分析下面展开ExtensionLoader.getExtensionLoader(xxx.class).getExtension(name)这行代码。publicstaticExtensionLoadergetExtensionLoader(Classtype){if(type==null)thrownewIllegalArgumentException("扩展类型==null");//判断给定类型是否为接口if(!type.isInterface()){thrownewIllegalArgumentException("扩展类型("+type+")不是接口!");}//判断给定接口上是否有SPI注解getSimpleName()+"注解!");}//先从map中获取ExtensionLoader,如果没有创建ExtensionLoaderloader=(ExtensionLoader)EXTENSION_LOADERS.get(type);if(loader==null){EXTENSION_LOADERS.putIfAbsent(type,newExtensionLoader(type));装载机=(ExtensionLoader)EXTENSION_LOADERS。得到(类型);}返回装载机;}该方法主要是获取ExtensionLoader:1、判断给定的类型,首先判断是否是接口类型;二、判断接口2是否有SPI注解,先根据给定的类型从Map中获取对应的ExtensionLoader,如果没有创建接下来,让我们看看getExtension(name)方法:publicTgetExtension(Stringname){if(name==null||name.length()==0)thrownewIllegalArgumentException("Extensionname==null");if("true".equals(name)){返回getDefaultExtension();}//首先获取包装类HolderHolder