按照使用说明文档,应该分下面几个步骤来使用:
- 创建一个接口文件
- 在resources资源目录下创建META-INF/services文件夹
- 在services文件夹中创建文件,以接口全名命名
- 创建接口实现类
public interface Animal {
void eat();
}
public class Dog implements Animal {
@Override
public void eat() {
System.out.println("Dog eating...");
}
}
public class Pig implements Animal {
@Override
public void eat() {
System.out.println("Pig eating...");
}
}
public class TestServiceLoader {
public static void main(String[] args) {
ServiceLoader<Animal> serviceLoader = ServiceLoader.load(Animal.class);
Iterator<Animal> animalIterator = serviceLoader.iterator();
while(animalIterator.hasNext()){
Animal animal = animalIterator.next();
animal.eat();
}
}
}
结果没有输出
解决方案一
把资源下的META-INF文件夹拷贝到build目录下,然后再运行,发现可以了
解决方案二
使用Google Auto-service开源插件
<dependencies>
<dependency>
<groupId>com.google.auto.service</groupId>
<artifactId>auto-service</artifactId>
<version>${version}</version>
<optional>true</optional>
</dependency>
</dependencies>
实现类添加注解
package foo.bar;
import javax.annotation.processing.Processor;
@AutoService(Processor.class)
final class MyProcessor implements Processor {
// …
}