1.概念:
a.定义:全称Service Provider Interface,即为某个接口寻找服务实现的机制。
b.约定:
1)在 META-INF/services/ 目录中创建以接口全限定名命名的文件,该文件内容为API具体实现类的全限定名
2)使用 ServiceLoader 类动态加载 META-INF 中的实现类
3)如 SPI 的实现类为 Jar 则需要放在主程序 ClassPath 中
4)API 具体实现类必须有一个不带参数的构造方法
c.意义:可以基于接口编程,实现模块间的解耦
2.使用:
a.创建接口
package com.wode.spi;
public interface Search {
public String search();
}
b.创建实现类
package com.wode.spi.impl;
import com.wode.spi.Search;
public class FileSearch implements Search {
@Override
public String search() {
return "search from file";
}
}
package com.wode.spi.impl;
import com.wode.spi.Search;
public class DatabaseSearch implements Search {
@Override
public String search() {
return "search from db";
}
}
c.在 resources/META-INF/services 下创建文件 com.wode.spi.Search(与接口全类名相同)
com.wode.spi.impl.FileSearch com.wode.spi.impl.DatabaseSearch
d.测试
ServiceLoader<Search> serviceLoader = ServiceLoader.load(Search.class);
Iterator<Search> searchs = serviceLoader.iterator();
while (searchs.hasNext()) {
Search search = searchs.next();
System.out.println(search.search());
}