Java ServiceLoader 类



简介

Java ServiceLoader 类是一个简单的服务提供程序加载工具。以下是关于 ServiceLoader 的重要要点:

  • 服务加载器始终在调用者的安全上下文中执行。受信任的系统代码通常应该在特权安全上下文中调用此类中的方法,以及它们返回的迭代器的方法。

  • 此类的实例不能由多个并发线程安全使用。

类声明

以下是java.util.ServiceLoader类的声明:

public final class ServiceLoader<S>
   extends Object
   implements Iterable<S>

参数

以下是java.util.ServiceLoader类的参数:

S - 这是此加载器要加载的服务类型。

类方法

序号 方法及描述
1 Optional<S> findFirst()

此方法加载此加载器服务的第一个可用服务提供程序。

2 Iterator<S> iterator()

此方法加载此加载器服务的可用提供程序。

3 public static <S> ServiceLoader<S> load(Class<S> service)

此方法使用当前线程的上下文类加载器为给定的服务类型创建一个新的服务加载器。

4 public static <S> ServiceLoader<S> loadInstalled(Class<S> service)

此方法使用扩展类加载器为给定的服务类型创建一个新的服务加载器。

5 void reload()

此方法清除此加载器的提供程序缓存,以便所有提供程序都将重新加载。

6 String toString()

此方法返回描述此服务的字符串。

继承的方法

此类继承自以下类的方法:

  • java.util.Object

获取 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
广告