一丶什么事SPI
SPI是查找实现类的一种机制。假设有一个接口,这个接口有N多实现类,Interface i 1= new Interface1();或者Interface i2 = new Interface2();,但是我们使用的时候用if(xx) i = new Interface1(); else i = new Interface2();未免也太繁琐了一点,于是乎就有了SPI。(当然,SPI的作用不局限于消除if else语句)
二丶SPI的使用
1.定义接口和实现类
假如有一个接口
package spi;
/**
* Created by Administrator on 2017/8/28.
*/
public interface DubboService {
public void sayHello();
}
实现类1
package spi;
/**
* Created by Administrator on 2017/8/28.
*/
public class RedService implements DubboService {
public void sayHello() {
System.out.println("我是RedService服务实现");
}
}
实现类2
package spi;
/**
* Created by Administrator on 2017/8/28.
*/
public class YellowService implements DubboService {
public void sayHello() {
System.out.println("我是YellowService服务实现");
}
}
2.在META-INF文件夹下创建文件夹services,然后在services下创建文件spi.DubboService(用接口的包名加类名来命名),文件内容
spi.RedService
spi.YellowService
3.写一个main函数
package spi;
import java.util.Iterator;
import java.util.ServiceLoader;
/**
* Created by Administrator on 2017/8/28.
*/
public class ServiceMain {
public static void main(String[] args){
//jdk自带的ServiceLoader
ServiceLoader<DubboService> spiLoader = ServiceLoader.load(DubboService.class);
Iterator<DubboService> iteratorSpi=spiLoader.iterator();
while (iteratorSpi.hasNext()){
DubboService dubboService=iteratorSpi.next();
dubboService.sayHello();
}
}
}
在dubbo中的SPI使用方法有所不同,是利用接口上加注解,然后文件中使用"接口注解字符串"=xx来使用
参考: