1. SPI是什么?
SPI即Service Provider Interface,用我不太专业的英语阅读理解就是服务供应者接口,反正大致就是这个意思。
那么这个接口有什么用处呢?或者说在JAVA中,这个东西有什么用?我总结能力比较差,于是我在网上找了一段文字。我觉得这个描述挺好的,至少比我好。
出处:Java SPI (Service Provider Interface) 机制详解
2. SPI的例子
- 创建一个接口
ISayHello
package cn.lazyfennec;
public interface ISayHello {
void sayHello();
}
- 创建两个实现类
SayHelloWithChinese
和SayHelloWithEnglish
- SayHelloWithChinese
package cn.lazyfennec.sayhello;
import cn.lazyfennec.ISayHello;
/**
* @Author: Neco
* @Description:
* @Date: create in 2022/11/25 15:17
*/
public class SayHelloWithChinese implements ISayHello {
@Override
public void sayHello() {
System.out.println("你好!");
}
}
- SayHelloWithEnglish
package cn.lazyfennec.sayhello;
import cn.lazyfennec.ISayHello;
/**
* @Author: Neco
* @Description:
* @Date: create in 2022/11/25 15:16
*/
public class SayHelloWithEnglish implements ISayHello {
@Override
public void sayHello() {
System.out.println("Hello!");
}
}
-
创建如下结构的内容,其中
services
目录下的文件名称需要与ISayHello
接口的全类名一致。
编辑
cn.lazyfennec.ISayHello
文件的内容,里边每一行对应一个实现类
cn.lazyfennec.sayhello.SayHelloWithChinese
cn.lazyfennec.sayhello.SayHelloWithEnglish
- 创建测试类
SpiTest
,这里会展示如何通过SPI机制获取相关的实现类。
package cn.lazyfennec;
import java.util.ServiceLoader;
/**
* @Author: Neco
* @Description:
* @Date: create in 2022/11/25 15:19
*/
public class SpiTest {
public static void main(String[] args) {
ServiceLoader<ISayHello> load = ServiceLoader.load(ISayHello.class);
// 这里打印了ServiceLoader的内容
System.out.println(load);
System.out.println("==============这是个分割线=================");
for (ISayHello sayHello : load) {
// 打印具体的类名
System.out.println(sayHello.getClass().getSimpleName());
// 执行方法
sayHello.sayHello();
System.out.println("===============================");
}
}
}
- 运行结果
java.util.ServiceLoader[cn.lazyfennec.ISayHello]
==============这是个分割线=================
SayHelloWithChinese
你好!
===============================
SayHelloWithEnglish
Hello!
===============================
Process finished with exit code 0
如果觉得有收获,欢迎点赞和评论,更多知识,请点击关注查看我的主页信息哦~