按照使用说明文档,应该分下面几个步骤来使用:

  1. 创建一个接口文件
  2. 在resources资源目录下创建META-INF/services文件夹
  3. 在services文件夹中创建文件,以接口全名命名
  4. 创建接口实现类
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目录下,然后再运行,发现可以了

ServiceLoader使用
解决方案二
使用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 {
  // …
}

相关文章:

  • 2021-08-08
  • 2021-12-18
  • 2021-10-25
  • 2021-09-28
  • 2022-12-23
  • 2021-07-11
  • 2021-09-25
猜你喜欢
  • 2021-07-03
  • 2022-01-01
  • 2022-12-23
  • 2022-12-23
  • 2021-06-07
相关资源
相似解决方案