AutoServiço do Google

AutoServiço do Google

1. Introdução

Neste tutorial rápido, explicaremos resumidamente o AutoServiço do Google.

Este é umannotation processor library que nos ajuda a gerar arquivos de configuraçãoJava Service Provider Interface (SPI).

2. Java SPI

Simplificando, podemos aproveitar o Java SPI para desenvolver aplicativos extensíveis, pois fornece personalizações rápidas, seguras e também dinâmicas.

Java SPI uses configuration files to find and load concrete implementations de interfaces de provedor de serviço fornecidas. A personalização imediata de um aplicativo é um dos seus principais recursos.

Por outro lado,it is easy to misconfigure and also a bit confusing for us to add or edit the configuration files. Esta etapa também é fácil de esquecer.

Além disso, sempre existe o risco de erros de digitação que podemos não perceber, pois os arquivos de configuração não são considerados pelo compilador.

3. AutoServiço do Google

Google AutoService é uma ferramenta geradora de código-fonte aberto, desenvolvida no projeto Google Auto. Existem também duas outras ferramentas além do AutoService:AutoValueeAutoFactory.

The purpose of this library is to save effort and time e, ao mesmo tempo,to prevent misconfiguration.

3.1. Configuração do Maven

Primeiro, vamos adicionar a dependênciaauto-service em nosso aplicativo. Podemos definir a dependência comooptional porque só precisamos dela em tempo de compilação:


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

3.2. @AutoService Exemplo

Em segundo lugar, criaremos uma interface de provedor de serviços.

Vamos supor que nosso aplicativo tenha um recurso de tradução. Nosso objetivo é tornar esse recurso extensível. Portanto, podemos conectar facilmente qualquer componente do provedor de serviços de tradução:

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

Nosso aplicativo usará essa interface como um ponto de extensão. Uma implementação no caminho de classe será injetada como um componente.

A seguir, implementaremos este serviço com dois provedores de tradução diferentes usando a anotação@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)";
    }
}

No momento da compilação, o AutoService procurará a anotação e gerará um arquivo de configuração para cada uma das interfaces e implementações correspondentes.

Como resultado, agora teremos um arquivo de configuração chamadocom.example.autoservice.TranslationService.. Este arquivo contém nomes totalmente qualificados dos dois provedores:

com.example.autoservice.BingTranslationServiceProvider
com.example.autoservice.GoogleTranslationServiceProvider

3.3. @AutoService em ação

Agora, está tudo pronto. Vamos carregar os provedores por meio deServiceLoader:

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

OServiceLoader carregará todos os provedores definidos no arquivo de configuração.

Vamos verificar a contagem de provedores carregados:

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

Em outras palavras, oServiceLoader carregou todas as instâncias do provedor. Portanto, é nosso trabalho selecionar um deles.

Então, agora, vamos escolher um dos provedores e chamar o método de serviço para ver se o carregador funciona conforme o esperado:

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. Conclusão

Neste artigo, explicamos a biblioteca do AutoService do Google e também praticamos com um exemplo simples.

O AutoService do Google é uma biblioteca útil, porém direta, de gerador de código-fonte. Ésaves us from creating and editing the service provider configuration files. Também garante que não haverá arquivos escritos incorretamente ou mal localizados.

O código-fonte deste tutorial está disponível emthe GitHub project normalmente.