Google AutoService

1. Въведение

В този бърз урок ще обясним накратко AutoService на Google.

Това е библиотека на процесор за анотиране, която ни помага при генерирането на конфигурационни файлове на Java Service Provider Interface (SPI).

2. Java SPI

Просто казано, можем да използваме Java SPI за разработване на разширяеми приложения, тъй като осигурява бързи, безопасни и динамични персонализации.

Java SPI използва конфигурационни файлове за намиране и зареждане на конкретни изпълнения на интерфейси на даден доставчик на услуги. Персонализирането на приложение в движение е една от основните му възможности.

От друга страна е лесно да конфигурирате погрешно и също малко объркващо за нас да добавяме или редактираме конфигурационните файлове. Тази стъпка също е лесна за забравяне.

Освен това винаги има риск от печатни грешки, които може да не забележим, тъй като конфигурационните файлове не се разглеждат от компилатора.

3. Google AutoService

Google AutoService е инструмент с генератор на код с отворен код, разработен в рамките на проекта Google Auto. Освен AutoService има и два други инструмента: AutoValue и AutoFactory.

Целта на тази библиотека е да спести усилия и време и в същото време да предотврати неправилно конфигуриране .

3.1. Настройка на Maven

Първо, нека добавим зависимостта на автоматичното обслужване в нашето приложение. Можем да зададем зависимостта като незадължителна, защото ни е необходима само по време на компилация:

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

3.2. @AutoService Пример

Второ, ще създадем интерфейс на доставчик на услуги.

Да приемем, че нашето приложение има функция за превод. Стремим се да направим тази функция разширима. Така че можем лесно да включим всеки компонент на доставчик на преводачески услуги:

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

Нашето приложение ще използва този интерфейс като точка за разширение. Като компонент ще се инжектира изпълнение на пътя на класа.

След това ще приложим тази услуга с два различни доставчика на преводи, използвайки анотацията @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)"; } }

По време на компилацията AutoService ще търси анотацията и ще генерира конфигурационен файл за всеки от съответните интерфейси и реализации.

В резултат на това сега ще имаме конфигурационен файл с име com.baeldung.autoservice.TranslationService. Този файл съдържа напълно квалифицирани имена на двамата доставчици:

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

3.3. @AutoService в действие

Сега всичко е готово. Нека да заредим доставчиците чрез ServiceLoader :

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

В ServiceLoader ще зареди всеки доставчик е определена в конфигурационния файл.

Нека проверим броя на заредените доставчици:

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

С други думи, ServiceLoader е заредил всички екземпляри на доставчика. Затова нашата работа е да изберем един от тях.

Така че сега, нека да изберем един от доставчиците и след това да извикаме метода на услугата, за да видим дали товарачът работи както се очаква:

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. Заключение

В тази статия обяснихме библиотеката на Google AutoService и практикувахме с прост пример.

Google AutoService е полезна, но ясна библиотека за генератор на изходен код. Това ни спестява от създаването и редактирането на конфигурационни файлове на доставчика на услуги . Той също така гарантира, че няма да има грешно написани или разместени файлове.

Изходният код на този урок е достъпен в проекта GitHub както обикновено.