JavaSPI—选择单个实现

JavaSPI—选择单个实现,java,serviceloader,Java,Serviceloader,当我们希望找到接口或抽象类的所有可用实现并对每个实现执行操作时,Java SPI使用起来很简单: ServiceLoader.load(SomeService.class) .forEach(service -> service.doSomething()); 从多个可用实现中选择单个实现的习惯用法是什么?我能想到的许多服务在多个实例中运行是没有意义的 我们可以使用iterator().next()只查找从ServiceLoader返回的第一个实现,但这并不能为用户提供一种方法来

当我们希望找到接口或抽象类的所有可用实现并对每个实现执行操作时,Java SPI使用起来很简单:

ServiceLoader.load(SomeService.class)
    .forEach(service -> service.doSomething());
从多个可用实现中选择单个实现的习惯用法是什么?我能想到的许多服务在多个实例中运行是没有意义的

我们可以使用
iterator().next()
只查找从ServiceLoader返回的第一个实现,但这并不能为用户提供一种方法来选择他们想要获取的特定实现(如果需要)。据我所知,迭代顺序有些随机,并且基于META-INF/services文件的类路径顺序,这是不一致的


当然,我遗漏了一些东西,这已经得到了处理,而无需编写我们自己的“if system property set,load this class,else iterator.next from ServiceLoader”

的习惯用法是
服务选择自身或返回null。习惯用法是
服务选择自身或返回null。