Java ServiceLoader Class



Introduction

The Java ServiceLoader class is a simple service-provider loading facility.Following are the important points about ServiceLoader −

  • Service loaders always execute in the security context of the caller.Trusted system code should typically invoke the methods in this class, and the methods of the iterators which they return, from within a privileged security context.

  • This class Instances are not safe for use by multiple concurrent threads.

Class declaration

Following is the declaration for java.util.ServiceLoader class −

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

Parameters

Following is the parameter for java.util.ServiceLoader class −

S − This is the type of service to be loaded by this loader.

Class methods

Sr.No. Method & Description
1 Optional<S> findFirst()

This method loads the first available service provider of this loader's service.

2 Iterator<S> iterator()

This method loads the available providers of this loader's service.

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

This method creates a new service loader for the given service type, using the current thread's context class loader.

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

This method creates a new service loader for the given service type, using the extension class loader.

5 void reload()

This method clear this loader's provider cache so that all providers will be reloaded.

6 String toString()

This method returns a string describing this service.

Methods inherited

This class inherits methods from the following classes −

  • java.util.Object

Getting a ServiceLoader implementation Instance Example

In order the service to be registered, we need a META-INF/services folder in our classpath. In this particular folder, we need a text file with the name of the interface we implementing containing a single line listing the concrete class name of the implementation. In our case the name of the file is com.tutorialspoint.ServiceProvider and contains this line −

com.tutorialspoint.ServiceImplementation

Our service code is the following −

package com.tutorialspoint;

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

The following code loads the service that is registered and uses it to get the message from the service. We've created a method getDefault() which returns a ServiceProvider. This method gets a serviceLoader object using ServiceLoader.load(). Using serviceLoader.findFirst() method, we've retrieved an Optional object of ServiceProvider and return ServiceProvider object using Optional.get() method. Then using getDefault() we've retrieved the serviceProvider and printed the message using this object.

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());
   }
}

Output

Let us compile and run the above program, this will produce the following result −

Hello World
Advertisements