Google AutoService

1. Inleiding

In deze korte handleiding leggen we de AutoService van Google kort uit.

Dit is een annotatieprocessorbibliotheek die ons helpt bij het genereren van Java Service Provider Interface (SPI) -configuratiebestanden.

2. Java SPI

Simpel gezegd, we kunnen Java SPI gebruiken om uitbreidbare applicaties te ontwikkelen, omdat het snelle, veilige en ook dynamische aanpassingen biedt.

Java SPI gebruikt configuratiebestanden om concrete implementaties te zoeken en te laden van bepaalde serviceproviderinterfaces. Het on-the-fly aanpassen van een applicatie is een van de belangrijkste mogelijkheden.

Aan de andere kant, het is gemakkelijk verkeerd te configureren en ook een beetje verwarrend voor ons om de configuratiebestanden toe te voegen of te bewerken. Deze stap is ook gemakkelijk te vergeten.

Bovendien is er altijd een risico op typefouten die we misschien niet opmerken, aangezien de configuratiebestanden niet worden meegenomen door de compiler.

3. Google AutoService

Google AutoService is een open source codegenerator, ontwikkeld onder het Google Auto-project. Naast AutoService zijn er nog twee andere tools: AutoValue en AutoFactory.

Het doel van deze bibliotheek is om moeite en tijd te besparen en op hetzelfde moment, om verkeerde configuratie te voorkomen.

3.1. Maven instellen

Laten we eerst de auto-serviceafhankelijkheid in onze applicatie toevoegen. We kunnen de afhankelijkheid instellen als optioneel omdat we het alleen nodig hebben tijdens het compileren:

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

3.2. @AutoService Voorbeeld

Ten tweede maken we een serviceproviderinterface.

Laten we aannemen dat onze applicatie een vertaalfunctie heeft. We streven ernaar om deze functie uitbreidbaar te maken. We kunnen dus eenvoudig elk onderdeel van een vertaalserviceprovider aansluiten:

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

Onze applicatie gebruikt deze interface als uitbreidingspunt. Een implementatie op het klassenpad wordt als component geïnjecteerd.

Vervolgens implementeren we deze service bij twee verschillende vertaalproviders die de @AutoService annotatie:

@AutoService (TranslationService.class) public class BingTranslationServiceProvider implementeert TranslationService {@Override public String translate (String message, Locale from, Locale to) {// implementatiedetails retourbericht + "(vertaald door Bing)"; }}
@AutoService (TranslationService.class) public class GoogleTranslationServiceProvider implementeert TranslationService {@Override public String translate (String message, Locale from, Locale to) {// implementatiedetails retourbericht + "(vertaald door Google)"; }}

Op het moment van compilatie zoekt AutoService naar de annotatie en genereert een configuratiebestand voor elk van de overeenkomstige interfaces en implementaties.

Als gevolg hiervan hebben we nu een configuratiebestand met de naam com.baeldung.autoservice.TranslationService. Dit bestand bevat volledig gekwalificeerde namen van de twee providers:

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

3.3. @AutoService in actie

Nu is alles klaar. Laten we de providers doorhalen ServiceLoader:

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

De ServiceLoader laadt elke provider die in het configuratiebestand is gedefinieerd.

Laten we eens kijken naar het aantal geladen providers:

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

Met andere woorden, de ServiceLoader heeft alle providerinstanties geladen. Daarom is het onze taak om er een te selecteren.

Laten we nu een van de providers kiezen en vervolgens de servicemethode bellen om te zien of de lader werkt zoals verwacht:

TranslationService googleService = StreamSupport.stream (loader.spliterator (), false) .filter (p -> p.getClass (). GetSimpleName (). Equals ("GoogleTranslationServiceProvider")) .findFirst () .get (); String message = "bericht"; assertEquals (bericht + "(vertaald door Google)", googleService.translate (bericht, null, null));

4. Conclusie

In dit artikel hebben we de Google AutoService-bibliotheek uitgelegd en ook geoefend met een eenvoudig voorbeeld.

Google AutoService is een handige maar duidelijke broncodegeneratorbibliotheek. Het bespaart ons op het maken en bewerken van de configuratiebestanden van de serviceprovider. Het garandeert ook dat er geen verkeerd geschreven of verkeerd geplaatste bestanden zullen zijn.

De broncode van deze tutorial is zoals gewoonlijk beschikbaar op het GitHub-project.


$config[zx-auto] not found$config[zx-overlay] not found