SPI(Service Provider Interface)是Java自带的服务发现机制,通过读取写入实现类的全限定名的配置文件来加载对应类,可以在运行的时候动态为接口替换实现类
示例
首先声明一个接口
package com.uzck.spi;
public interface GreetService {
String sayHi(String msg);
}
接下来定义两个实现类
package com.uzck.spi.impl;
public class EnglishGreetServiceImpl {
@Override
public String sayHi(String msg) {
return "Hello " + msg;
}
}
public class ChineseGreetServiceImpl {
@Override
public String sayHi(String msg) {
return "你好 " + msg;
}
}
接下来在src/main/res下创建META-INF/services文件夹,并创建文件com.uzck.spi.GreetService,文件内容为
com.uzck.spi.impl.ChineseGreetServiceImpl
com.uzck.spi.impl.EnglishGreetServiceImpl
测试代码如下
public class SPICaller {
public static void main(String[] args) {
ServiceLoader<DemoService> serviceLoader = ServiceLoader.load(DemoService.class);
Iterator<DemoService> it = serviceLoader.iterator();
while (it != null && it.hasNext()) {
DemoService service = it.next();
System.out.println("class " + service.getClass().getName()
+ " " + service.sayHi("World"));
}
}
}
输出为
class com.uzck.spi.impl.EnglishDemoServiceImpl Hello World
class com.uzck.spi.impl.ChineseDemoServiceImpl 你好, World