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.