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
廣告