Java ServiceLoader findFirst() Method



Description

The Java ServiceLoader findFirst() method loads the first available service provider of this loader's service. This convenience method is equivalent to invoking the iterator() method and obtaining the first element. It therefore returns the first element from the provider cache if possible, it otherwise attempts to load and instantiate the first provider.

Declaration

Following is the declaration for java.util.ServiceLoader.findFirst() method

public Optional<S> findFirst()

Parameters

NA

Return Value

This method returns the first service provider or empty Optional if no service providers are located.

Exception

ServiceConfigurationError − If a provider class cannot be loaded for any of the reasons specified in the Errors section above.

Getting a ServiceLoader 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
java_util_serviceloader.htm
Advertisements