package com.spi;
public interface Search {
void gSearch();
}
package com.spi.impl;
import com.spi.Search;
public class GASearch implements Search {
@Override
public void gSearch() {
System.out.println("----GASearch----");
}
}
package com.spi;
import java.util.Iterator;
import java.util.ServiceLoader;
public class Main {
public static Search getSearch() {
ServiceLoader<Search> serviceLoader = ServiceLoader.load(Search.class);
Iterator<Search> searchIterator = serviceLoader.iterator();
Search search = null;
if (searchIterator.hasNext()) {
search = searchIterator.next();
}
return search;
}
public static void main(String[] args) {
getSearch().gSearch();
}
}
resources/META-INF/services/com.spi.Search 中的内容如下
com.spi.impl.GASearch
JavaSPI主要是将接口与实现分离开来,分别位于不同的模块中,在需要的模块中对相应的接口做一个实现,并在实现模块中的resources/META-INF/services/com.spi.Search文件中指定实现类com.spi.impl.GASearch。然后实现方通过
ServiceLoader<Search> serviceLoader = ServiceLoader.load(Search.class);
Iterator<Search> searchIterator = serviceLoader.iterator();
获取meta-info文件中指定的实现类。(上面截图中的接口与实现可以位于不同的模块,使用的时候主要通过meta-inf文件来指向相应的实现类)