Java ServiceLoader findFirst() 方法



描述

Java ServiceLoader findFirst() 方法加载此加载器的服务的第一个可用服务提供程序。此便捷方法等效于调用 iterator() 方法并获取第一个元素。因此,如果可能,它将返回提供程序缓存中的第一个元素;否则,它将尝试加载并实例化第一个提供程序。

声明

以下是java.util.ServiceLoader.findFirst() 方法的声明

public Optional<S> findFirst()

参数

返回值

此方法返回第一个服务提供程序,如果未找到任何服务提供程序,则返回空 Optional。

异常

ServiceConfigurationError − 如果由于上述错误部分中指定的任何原因无法加载提供程序类。

获取 ServiceLoader 实例示例

为了注册服务,我们需要在类路径中有一个 META-INF/services 文件夹。在这个特定文件夹中,我们需要一个文本文件,其名称为我们正在实现的接口的名称,其中包含一行列出实现的具体类名的单行文本。在我们的例子中,文件名是com.tutorialspoint.ServiceProvider,包含这一行:

com.tutorialspoint.ServiceImplementation

我们的服务代码如下:

package com.tutorialspoint;

public class ServiceImplementation extends ServiceProvider {
   public String getMessage() {
      return "Hello World";
   }
}

以下代码加载已注册的服务并使用它从服务获取消息。我们创建了一个 getDefault() 方法,它返回一个 ServiceProvider。此方法使用 ServiceLoader.load() 获取一个 serviceLoader 对象。使用 serviceLoader.findFirst() 方法,我们检索了一个 ServiceProvider 的 Optional 对象,并使用 Optional.get() 方法返回 ServiceProvider 对象。然后使用 getDefault() 我们检索了 serviceProvider 并使用此对象打印了消息。

package com.tutorialspoint;

import java.util.Optional;
import java.util.ServiceLoader;

public abstract class ServiceProvider {
   public static ServiceProvider getDefault() {

      // load our plugin
      ServiceLoader<ServiceProvider> serviceLoader =
      ServiceLoader.load(ServiceProvider.class);

      Optional<ServiceProvider> serviceProvider = serviceLoader.findFirst();

      return serviceProvider.get();
   }

   public abstract String getMessage();
   public static void main(String[] ignored) {

      // create a new provider and call getMessage()
      ServiceProvider provider = ServiceProvider.getDefault();
      System.out.println(provider.getMessage());
   }
}

输出

让我们编译并运行上述程序,这将产生以下结果:

Hello World
java_util_serviceloader.htm
广告