SPI:一种服务发现机制,service provider interface 的简称。主要通过加载文件中配置信息加载类资源。
java自带的SPI实现:
1、需要在根路径下创建META-INF/services文件夹,再以接口全路径为名创建配置文件
2、以接口全路径为名的文件夹中的,以实现类的全路径名为内容,一个一行
com.generic.designPatterns.spi.javaSPI.TaylorUltraman
com.generic.designPatterns.spi.javaSPI.SevenUltraman
3、加载配置文件,ServiceLoader.load加载配置文件,并实例配置文件中的实现类
public class SPIMechanismByJava {
public static void main(String[] args) {
//加载接口信息
ServiceLoader<Ultraman> serviceLoader = ServiceLoader.load(Ultraman.class);
//获取所有接口实现类
Iterator<Ultraman> iterator = serviceLoader.iterator();
while (iterator.hasNext()){
Ultraman ultraMan = iterator.next();
ultraMan.say();
}
}
}
java的SPI机制,每次加载配置文件的所有数据,然后实例,调用时循环获取实例调用。
可能有些不需要的配置也会被加载,浪费系统资源。
dubbo的SPI实现:
基于java的SPI可能会加载部分无用的实现类,浪费系统资源,dubbo在此基础上,采用键值对的方式来配置处理类,这样就可能根据需求来加载需要的处理类了。
1、在根路径下创建:/META-INF/dubbo文件夹,再以接口的全限定名创建文件
2、和java的SPI配置不同的是以key=value保存的,可以根据需要的key来加载实现类
taylor=com.generic.designPatterns.spi.dubboSPI.TaylorUltramanForDubbo
seven=com.generic.designPatterns.spi.dubboSPI.SevenUltramanForDubbo
3、加载配置文件,
public class SPIMechanismByDubbo {
public static void main(String[] args) {
ExtensionLoader<UltramanForDubbo> extensionLoader = ExtensionLoader.getExtensionLoader(UltramanForDubbo.class);
//和java的SPI不同的是,可以根据配置文件的key加载服务,避免加载无用实现类
UltramanForDubbo taylor = extensionLoader.getExtension("taylor");
taylor.sayForDubbo();
UltramanForDubbo seven = extensionLoader.getExtension("seven");
seven.sayForDubbo();
}
}