spi 拓展机制
SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 SPI的作用就是为这些被扩展的API寻找服务实现。
主要用到ServiceLoader这个类,ServiceLoader通过读取resources/META-INF/services/com.xxx.xxx.xxxService文件下的xxxService的spi实现类,通过反射获取对应类实例,并调用对应方法。
SPI的简单实现
下面我们来简单实现一个jdk的SPI的简单实现。
1. 首先第一步,定义一组接口:
public interface UploadCDN {
void upload(String url);
}
- 这个接口分别有两个实现:
public class QiyiCDN implements UploadCDN { //上传爱奇艺cdn
@Override
public void upload(String url) {
System.out.println("upload to qiyi cdn");
}
}
public class ChinaNetCDN implements UploadCDN {//上传网宿cdn
@Override
public void upload(String url) {
System.out.println("upload to chinaNet cdn");
}
}
3. 然后需要在resources目录下新建META-INF/services目录,并且在这个目录下新建一个与上述接口的全限定名一致的文件,在这个文件中写入接口的实现类的全限定名:
- 这时,通过serviceLoader加载实现类并调用:
public static void main(String[] args) {
ServiceLoader<UploadCDN> uploadCDN = ServiceLoader.load(UploadCDN.class);
for (UploadCDN u : uploadCDN) {
System.out.println(u.getClass().getName());
u.upload("filePath");
}
}
输出如下:
总结
- 关于spi的详解到此就结束了,总结下spi能带来的好处:
- 不需要改动源码就可以实现扩展,解耦。
- 实现扩展对原来的代码几乎没有侵入性。
- 只需要添加配置就可以实现扩展,符合开闭原则。
场景:(国票)