Google AutoService

1. Introduction

Dans ce rapide tutoriel, nous expliquerons brièvement l'AutoService de Google.

Il s'agit d'une bibliothèque de processeurs d'annotations qui nous aide à générer des fichiers de configuration SPI (Java Service Provider Interface).

2. Java SPI

En termes simples, nous pouvons tirer parti de Java SPI pour développer des applications extensibles, car il fournit des personnalisations rapides, sûres et dynamiques.

Java SPI utilise des fichiers de configuration pour rechercher et charger des implémentations concrètes d'interfaces de fournisseur de services données. La personnalisation d'une application à la volée est l'une de ses principales capacités.

D'un autre côté, il est facile de mal configurer et aussi un peu déroutant pour nous d'ajouter ou de modifier les fichiers de configuration. Cette étape est également facile à oublier.

De plus, il y a toujours un risque de fautes de frappe que nous pouvons ne pas remarquer, car les fichiers de configuration ne sont pas pris en compte par le compilateur.

3. Google AutoService

Google AutoService est un outil générateur de code open source, développé dans le cadre du projet Google Auto. Il existe également deux autres outils en plus d'AutoService: AutoValue et AutoFactory.

Le but de cette bibliothèque est d'économiser du temps et des efforts et, en même temps, d'éviter les erreurs de configuration .

3.1. Configuration de Maven

Tout d'abord, ajoutons la dépendance de service automatique dans notre application. Nous pouvons définir la dépendance comme facultative car nous n'en avons besoin qu'au moment de la compilation:

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

3.2. Exemple @AutoService

Deuxièmement, nous allons créer une interface de fournisseur de services.

Supposons que notre application dispose d'une fonction de traduction. Nous visons à rendre cette fonctionnalité extensible. Ainsi, nous pouvons facilement brancher n'importe quel composant de fournisseur de services de traduction:

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

Notre application utilisera cette interface comme point d'extension. Une implémentation sur le classpath sera injectée en tant que composant.

Ensuite, nous implémenterons ce service avec deux fournisseurs de traduction différents à l'aide de l' annotation @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)"; } }

Au moment de la compilation, AutoService recherchera l'annotation et générera un fichier de configuration pour chacune des interfaces et implémentations correspondantes.

En conséquence, nous aurons maintenant un fichier de configuration nommé com.baeldung.autoservice.TranslationService. Ce fichier contient les noms complets des deux fournisseurs:

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

3.3. @AutoService en action

Maintenant, tout est prêt. Chargons les fournisseurs via ServiceLoader :

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

Le ServiceLoader chargera chaque fournisseur défini dans le fichier de configuration.

Vérifions le nombre de fournisseurs chargés:

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

En d'autres termes, ServiceLoader a chargé toutes les instances du fournisseur. Par conséquent, c'est notre travail de sélectionner l'un d'entre eux.

Alors maintenant, choisissons l'un des fournisseurs, puis appelons la méthode de service pour voir si le chargeur fonctionne comme prévu:

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. Conclusion

Dans cet article, nous avons expliqué la bibliothèque Google AutoService et nous nous sommes également entraînés avec un exemple simple.

Google AutoService est une bibliothèque de générateur de code source utile mais simple. Cela nous évite de créer et de modifier les fichiers de configuration du fournisseur de services . Cela garantit également qu'il n'y aura pas de fichiers mal écrits ou mal répartis.

Le code source de ce tutoriel est disponible sur le projet GitHub comme d'habitude.