SPI(Service Provider Interface),是JDK内置的一种 服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用,比如java.sql.Driver接口,其他不同厂商可以针对同一接口做出不同的实现,MySQL和PostgreSQL都有不同的实现提供给用户,而Java的SPI机制可以为某个接口寻找服务实现。Java中SPI机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是 解耦。
图示:
代码示例:
接口(一般由框架或者第三方提供)
public interface IUser {
public List<String> getUserList();
}
接口实现类(调用者实现逻辑)
public class UserImpl implements IUser {
@Override
public List<String> getUserList() {
ArrayList<String> list = new ArrayList<>();
list.add("小张");
list.add("小李");
list.add("小宋");
return list;
}
}
项目resources下新建META-INF/services添加一个名为接口全类名文件,里面填写实现类全类名
测试
public class Client {
public static void main(String[] args) {
ServiceLoader<IUser> loader = ServiceLoader.load(IUser.class);
Iterator<IUser> iterator = loader.iterator();
while (iterator.hasNext()){
IUser userList = iterator.next();
List<String> list = userList.getUserList();
System.out.println(list);
}
}
}
结果:输出实现类内容,如果文件里写上两个实现类,那最后的输出结果就是两行了。
结论:spi的思想,接口的实现由provider实现,provider只用在提交的jar包里的META-INF/services下根据平台定义的接口新建文件,并添加进相应的实现类内容就好。