«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

Во-первых, давайте добавим зависимость автосервиса в наше приложение. Мы можем установить зависимость как необязательную, потому что она нужна нам только во время компиляции:

<dependency>
    <groupId>com.google.auto.service</groupId>
    <artifactId>auto-service</artifactId>
    <version>1.0-rc5</version>
    <optional>true</optional>
</dependency>

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.BingTranslationServiceProvider
com.baeldung.autoservice.GoogleTranslationServiceProvider

В результате у нас будет файл конфигурации с именем com.baeldung.autoservice.TranslationService. Этот файл содержит полные имена двух поставщиков:

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

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

Теперь все готово. Давайте загрузим провайдеров через ServiceLoader:

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 — полезная, но простая библиотека генератора исходного кода. Это избавляет нас от создания и редактирования файлов конфигурации поставщика услуг. Это также гарантирует, что не будет никаких неправильно написанных или неправильно расположенных файлов.