# 1. SPI的实现
java.util.ServiceLoader
# 1.1. 定义
Service Provider Interface 面向接口编程的重要思路
# 1.2. 实现过程
- 定义接口
public interface Printer {
void print(String inString);
}
1
2
3
2
3
- 定义实现类
- 实现类1
public class FunnyPrinter implements Printer {
@Override
public void print(String inString) {
System.out.println(""---This is a funny printer----"");
System.out.println(inString);
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
- 实现类2
public class DiyPrinter implements Printer{
@Override
public void print(String inString) {
System.out.println(""---This is a diy printer----"");
System.out.println(inString);
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
- 在项目中定义接口的实现类
- 项目根目录中添加META-INF/services文件夹,具体实现方法各异,idea的实现方法之一如下
- 新建resources文件夹
- 右键resources文件夹,mark as resources root,默认情况下,resources root对应的文件夹下的内容会自动部署到项目根目录
- 在新建的resources文件夹下创建META-INF/services文件夹
- 新建文件,文件名为接口的全限定名,本例为tasteSPI.printer
- 文件内容为具体实现类的类命,本例为tasteSPI.DiyPrinter或tasteSPI.FunnyPrinter
- 项目根目录中添加META-INF/services文件夹,具体实现方法各异,idea的实现方法之一如下
- 测试是否成功 在配置为tasteSPI.DiyPrinter时
public class TestCase {
public static void main(String[] args) {
ServiceLoader<Printer> printers = ServiceLoader.load(Printer.class);
Iterator<Printer> printerIterator = printers.iterator();
Printer printer;
while (printerIterator.hasNext()) {
printer = printerIterator.next();
printer.print(""test page"");
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
输出
---This is a diy printer---- test page