Google AutoService

1. Einleitung

In diesem kurzen Tutorial erklären wir kurz den AutoService von Google.

Dies ist eine Annotationsprozessorbibliothek, die uns beim Generieren von SPI-Konfigurationsdateien (Java Service Provider Interface) hilft.

2. Java SPI

Kurz gesagt, wir können Java SPI nutzen, um erweiterbare Anwendungen zu entwickeln, da es schnelle, sichere und auch dynamische Anpassungen bietet.

Java SPI verwendet Konfigurationsdateien, um konkrete Implementierungen bestimmter Dienstanbieterschnittstellen zu finden und zu laden . Das Anpassen einer Anwendung im laufenden Betrieb ist eine der Hauptfunktionen.

Andererseits ist es leicht falsch zu konfigurieren und auch etwas verwirrend für uns, die Konfigurationsdateien hinzuzufügen oder zu bearbeiten. Dieser Schritt ist auch leicht zu vergessen.

Außerdem besteht immer das Risiko von Tippfehlern, die wir möglicherweise nicht bemerken, da die Konfigurationsdateien vom Compiler nicht berücksichtigt werden.

3. Google AutoService

Google AutoService ist ein Open Source Code Generator-Tool, das im Rahmen des Google Auto-Projekts entwickelt wurde. Neben AutoService gibt es noch zwei weitere Tools: AutoValue und AutoFactory.

Der Zweck dieser Bibliothek ist zu sparen Aufwand und Zeit , und zur gleichen Zeit zu verhindern Fehlkonfiguration .

3.1. Maven Setup

Fügen wir zunächst die Auto-Service-Abhängigkeit in unsere Anwendung ein. Wir können die Abhängigkeit als optional festlegen, da wir sie nur zur Kompilierungszeit benötigen:

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

3.2. @ AutoService Beispiel

Zweitens erstellen wir eine Dienstanbieterschnittstelle.

Nehmen wir an, dass unsere Anwendung über eine Übersetzungsfunktion verfügt. Wir möchten diese Funktion erweiterbar machen. So können wir jede Komponente eines Übersetzungsdienstleisters einfach anschließen:

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

Unsere Anwendung verwendet diese Schnittstelle als Erweiterungspunkt. Eine Implementierung im Klassenpfad wird als Komponente eingefügt.

Als Nächstes implementieren wir diesen Service mit zwei verschiedenen Übersetzungsanbietern mithilfe der 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)"; } }

Zum Zeitpunkt der Kompilierung sucht AutoService nach der Anmerkung und generiert eine Konfigurationsdatei für jede der entsprechenden Schnittstellen und Implementierungen.

Als Ergebnis haben wir jetzt eine Konfigurationsdatei mit dem Namen com.baeldung.autoservice.TranslationService. Diese Datei enthält vollständig qualifizierte Namen der beiden Anbieter:

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

3.3. @ AutoService in Aktion

Jetzt ist alles fertig. Laden wir die Anbieter über ServiceLoader :

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

Der ServiceLoader lädt jeden in der Konfigurationsdatei definierten Anbieter.

Überprüfen wir die Anzahl der geladenen Anbieter:

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

Mit anderen Worten, der ServiceLoader hat alle Provider-Instanzen geladen. Daher ist es unsere Aufgabe, einen von ihnen auszuwählen.

Wählen wir nun einen der Anbieter aus und rufen die Servicemethode auf, um festzustellen, ob der Loader wie erwartet funktioniert:

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

In diesem Artikel haben wir die Google AutoService-Bibliothek erläutert und anhand eines einfachen Beispiels geübt.

Google AutoService ist eine nützliche, aber unkomplizierte Quellcode-Generatorbibliothek. Dies erspart uns das Erstellen und Bearbeiten der Konfigurationsdateien des Dienstanbieters . Es garantiert auch, dass keine falsch geschriebenen oder falsch platzierten Dateien vorhanden sind.

Der Quellcode dieses Tutorials ist wie gewohnt im GitHub-Projekt verfügbar.