Google AutoService

1. Introduzione

In questo breve tutorial, spiegheremo brevemente l'AutoService di Google.

Si tratta di una libreria del processore di annotazioni che ci aiuta a generare file di configurazione SPI (Java Service Provider Interface).

2. Java SPI

In poche parole, possiamo sfruttare Java SPI per sviluppare applicazioni estensibili, poiché fornisce personalizzazioni veloci, sicure e anche dinamiche.

Java SPI utilizza i file di configurazione per trovare e caricare implementazioni concrete di determinate interfacce del provider di servizi. La personalizzazione di un'applicazione al volo è una delle sue capacità principali.

D'altra parte, è facile configurare in modo errato e anche un po 'di confusione per noi aggiungere o modificare i file di configurazione. Anche questo passaggio è facile da dimenticare.

Inoltre, c'è sempre il rischio di errori di battitura che potremmo non notare, poiché i file di configurazione non sono considerati dal compilatore.

3. Google AutoService

Google AutoService è uno strumento generatore di codice open source, sviluppato nell'ambito del progetto Google Auto. Ci sono anche altri due strumenti oltre a AutoService: AutoValue e AutoFactory.

Lo scopo di questa libreria è risparmiare fatica e tempo e, allo stesso tempo, prevenire errori di configurazione .

3.1. Maven Setup

Innanzitutto, aggiungiamo la dipendenza del servizio automatico nella nostra applicazione. Possiamo impostare la dipendenza come opzionale perché ne abbiamo bisogno solo in fase di compilazione:

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

3.2. @AutoService Esempio

Secondo, creeremo un'interfaccia per provider di servizi.

Supponiamo che la nostra applicazione abbia una funzione di traduzione. Il nostro obiettivo è rendere questa funzionalità estensibile. Quindi, possiamo collegare facilmente qualsiasi componente del fornitore di servizi di traduzione:

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

La nostra applicazione utilizzerà questa interfaccia come punto di estensione. Un'implementazione sul classpath verrà inserita come componente.

Successivamente, implementeremo questo servizio con due diversi fornitori di traduzione utilizzando l' annotazione @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)"; } }

Al momento della compilazione, AutoService cercherà l'annotazione e genererà un file di configurazione per ciascuna delle interfacce e implementazioni corrispondenti.

Di conseguenza, ora avremo un file di configurazione denominato com.baeldung.autoservice.TranslationService. Questo file contiene i nomi completi dei due provider:

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

3.3. @AutoService in azione

Adesso è tutto pronto. Carichiamo i provider tramite ServiceLoader :

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

Il ServiceLoader caricherà ogni fornitore di definito nel file di configurazione.

Controlliamo il conteggio dei provider caricati:

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

In altre parole, ServiceLoader ha caricato tutte le istanze del provider. Pertanto, è nostro compito selezionarne uno.

Quindi ora, scegliamo uno dei provider e quindi chiamiamo il metodo di servizio per vedere se il caricatore funziona come previsto:

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

In questo articolo, abbiamo spiegato la libreria di Google AutoService e ci siamo anche esercitati con un semplice esempio.

Google AutoService è una libreria di generatore di codice sorgente utile ma semplice. Ci evita di creare e modificare i file di configurazione del fornitore di servizi . Garantisce inoltre che non ci saranno file scritti male o posizionati male.

Il codice sorgente di questo tutorial è disponibile nel progetto GitHub come al solito.