1. Введение
В этом кратком руководстве мы кратко объясним AutoService Google.
Это библиотека процессора аннотаций, которая помогает нам создавать файлы конфигурации Java Service Provider Interface (SPI).
2. Java SPI
Проще говоря, мы можем использовать Java SPI для разработки расширяемых приложений, поскольку он обеспечивает быструю, безопасную, а также динамическую настройку.
Java SPI использует файлы конфигурации для поиска и загрузки конкретных реализаций заданных интерфейсов поставщика услуг. Настройка приложения «на лету» — одна из его основных возможностей.
С другой стороны, легко неправильно настроить, а также немного запутать нас, добавляя или редактируя файлы конфигурации. Этот шаг также легко забыть.
Кроме того, всегда есть риск опечаток, которые мы можем не заметить, так как файлы конфигурации не учитываются компилятором.
3. Автосервис Google
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.foreach.autoservice.TranslationService.
Этот файл содержит полные имена двух поставщиков:
com.foreach.autoservice.BingTranslationServiceProvider
com.foreach.autoservice.GoogleTranslationServiceProvider
3.3. @AutoService
в действии
Теперь все готово. Загрузим провайдеров через ServiceLoader
:
ServiceLoader<TranslationService> 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 .