Рубрики
Без рубрики

Сервис Google Auto

Узнайте, как использовать автоматический сервис Google для создания файлов конфигурации интерфейса поставщика услуг Java (SPI)

Автор оригинала: baeldung.

1. введение

В этом кратком руководстве мы кратко расскажем об автосервисе Google.

Это библиотека процессоров аннотаций, которая помогает нам создавать файлы конфигурации интерфейса поставщика услуг Java (SPI).

2. Java API

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

Java SPI использует файлы конфигурации для поиска и загрузки конкретных реализаций заданных интерфейсов поставщика услуг. Настройка приложения на лету-одна из его основных возможностей.

С другой стороны, легко неправильно сконфигурировать, а также немного запутать нас при добавлении или редактировании файлов конфигурации. Этот шаг также легко забыть.

Кроме того, всегда существует риск опечаток, которые мы можем не заметить, поскольку файлы конфигурации не рассматриваются компилятором.

3. Сервис Google Auto

Google Auto Service – это инструмент для генерации кода с открытым исходным кодом, разработанный в рамках проекта Google Auto. Есть также два других инструмента, помимо автосервиса: Auto Value и Auto Factory .

Целью этой библиотеки является экономия усилий и времени и, в то же время, предотвращение неправильной конфигурации .

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

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


    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)"; 
    }
}

Во время компиляции Автосервис будет искать аннотацию и генерировать файл конфигурации для каждого из соответствующих интерфейсов и реализаций.

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

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, а также попрактиковались на простом примере.

Сервис Google Auto – это полезная, но простая библиотека генератора исходного кода. Это избавляет нас от создания и редактирования файлов конфигурации поставщика услуг . Это также гарантирует, что не будет никаких неправильно написанных или неправильно размещенных файлов.

Исходный код этого учебника доступен в проекте GitHub , как обычно.