AutoService de Google

1. Introducción

En este rápido tutorial, explicaremos brevemente el AutoService de Google.

Esta es una biblioteca de procesador de anotaciones que nos ayuda a generar archivos de configuración de interfaz de proveedor de servicios Java (SPI).

2. Java SPI

En pocas palabras, podemos aprovechar Java SPI para desarrollar aplicaciones extensibles, ya que proporciona personalizaciones rápidas, seguras y también dinámicas.

Java SPI usa archivos de configuración para buscar y cargar implementaciones concretas de interfaces de proveedores de servicios dadas. La personalización de una aplicación sobre la marcha es una de sus principales capacidades.

Por otro lado, es fácil de configurar mal y también un poco confuso para nosotros agregar o editar los archivos de configuración. Este paso también es fácil de olvidar.

Además, siempre existe el riesgo de errores tipográficos que quizás no nos demos cuenta, ya que el compilador no tiene en cuenta los archivos de configuración.

3. Google AutoService

Google AutoService es una herramienta generadora de código fuente abierta, desarrollada bajo el proyecto Google Auto. También hay otras dos herramientas además de AutoService: AutoValue y AutoFactory.

El propósito de esta biblioteca es ahorrar esfuerzo y tiempo y, al mismo tiempo, evitar errores de configuración .

3.1. Configuración de Maven

Primero, agreguemos la dependencia de autoservicio en nuestra aplicación. Podemos establecer la dependencia como opcional porque solo la necesitamos en tiempo de compilación:

 com.google.auto.service auto-service 1.0-rc5 true 

3.2. @AutoService Ejemplo

En segundo lugar, crearemos una interfaz de proveedor de servicios.

Supongamos que nuestra aplicación tiene una función de traducción. Nuestro objetivo es hacer que esta característica sea extensible. Por lo tanto, podemos conectar fácilmente cualquier componente del proveedor de servicios de traducción:

public interface TranslationService { String translate(String message, Locale from, Locale to); }

Nuestra aplicación utilizará esta interfaz como un punto de extensión. Se inyectará una implementación en la ruta de clases como componente.

A continuación, implementaremos este servicio con dos proveedores de traducción diferentes utilizando la anotación @AutoService :

@AutoService(TranslationService.class) public class BingTranslationServiceProvider implements TranslationService { @Override public String translate(String message, Locale from, Locale to) { // implementation details return message + " (translated by Bing)"; } }
@AutoService(TranslationService.class) public class GoogleTranslationServiceProvider implements TranslationService { @Override public String translate(String message, Locale from, Locale to) { // implementation details return message + " (translated by Google)"; } }

En el momento de la compilación, AutoService buscará la anotación y generará un archivo de configuración para cada una de las interfaces e implementaciones correspondientes.

Como resultado, ahora tendremos un archivo de configuración llamado com.baeldung.autoservice.TranslationService. Este archivo contiene nombres completos de los dos proveedores:

com.baeldung.autoservice.BingTranslationServiceProvider com.baeldung.autoservice.GoogleTranslationServiceProvider

3.3. @AutoService en acción

Ahora todo está listo. Carguemos los proveedores a través de ServiceLoader :

ServiceLoader loader = ServiceLoader.load(TranslationService.class);

El ServiceLoader cargará todos los proveedores definidos en el archivo de configuración.

Comprobemos el recuento de proveedores cargados:

long count = StreamSupport.stream(loader.spliterator(), false).count(); assertEquals(2, count);

En otras palabras, ServiceLoader ha cargado todas las instancias del proveedor. Por lo tanto, es nuestro trabajo seleccionar uno de ellos.

Así que ahora, seleccionemos uno de los proveedores y luego llamemos al método de servicio para ver si el cargador funciona como se esperaba:

TranslationService googleService = StreamSupport.stream(loader.spliterator(), false) .filter(p -> p.getClass().getSimpleName().equals("GoogleTranslationServiceProvider")) .findFirst() .get(); String message = "message"; assertEquals(message + " (translated by Google)", googleService.translate(message, null, null));

4. Conclusión

En este artículo, explicamos la biblioteca Google AutoService y también practicamos con un ejemplo simple.

Google AutoService es una biblioteca generadora de código fuente útil pero sencilla. Nos ahorra crear y editar los archivos de configuración del proveedor de servicios . También garantiza que no habrá archivos mal escritos o mal ubicados.

El código fuente de este tutorial está disponible en el proyecto GitHub como de costumbre.