java - Java SPI - 选择单个实现
问题描述
当我们想要查找接口或抽象类的所有可用实现并对每个实现执行操作时,Java SPI 很容易使用:
ServiceLoader.load(SomeService.class)
.forEach(service -> service.doSomething());
从多个可用实现中选择一个实现的习惯用法是什么?我能想到的许多服务在使用多个实例时没有意义。
我们可以用它iterator().next()
来查找从 ServiceLoader 返回的第一个实现,但这并没有为用户提供一种方法来选择他们想要在必要时选择哪个特定实现。据我所知,迭代顺序有点随机,并且基于 META-INF/services 文件的类路径顺序,这是不一致的。
当然我遗漏了一些东西,这已经被处理了,而不必编写我们自己的“如果设置了系统属性,则加载这个类,否则来自 ServiceLoader 的 iterator.next”