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()); }