Google AutoService

Google AutoService

1.简介

在本快速教程中,我们将简要介绍Google的AutoService。

这是一个注释处理器库,可帮助我们生成Java服务提供商接口(SPI)配置文件。

2. Java SPI

简而言之,我们可以利用Java SPI开发可扩展的应用程序,因为它提供了快速,安全且动态的自定义功能。

Java SPI使用配置文件来查找和加载给定服务提供商接口的具体实现。动态定制应用程序是其主要功能之一。

另一方面,很容易配置错误,也给我们添加或编辑配置文件带来一些困惑。这一步也很容易忘记。

此外,由于编译器未考虑配置文件,因此总是存在我们可能不会注意到拼写错误的风险。

3. Google AutoService

Google AutoService是在Google Auto项目下开发的开源代码生成器工具。除了自动服务外,还有两个其他工具:AutoValue和AutoFactory。

该库的目的是节省工作量和时间,同时防止配置错误。

3.1。 Maven设置

首先,让我们在应用程序中添加自动服务依赖项。我们可以将依赖项设置为可选,因为我们仅在编译时需要它:

1
2
3
4
5
6
<dependency>
    <groupId>com.google.auto.service</groupId>
    auto-service</artifactId>
    <version>1.0-rc5</version>
    <optional>true</optional>
</dependency>

3.2。 @AutoService示例

其次,我们将创建一个服务提供商接口。

假设我们的应用程序具有翻译功能。我们旨在使此功能可扩展。因此,我们可以轻松插入任何翻译服务提供商组件:

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

我们的应用程序将使用此接口作为扩展点。类路径上的实现将作为组件注入。

接下来,我们将使用@AutoService批注通过两个不同的翻译提供程序实现此服务:

1
2
3
4
5
6
7
8
@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)";
    }
}

1
2
3
4
5
6
7
8
@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.TranslationService的配置文件。该文件包含两个提供者的标准名称:

1
2
com.baeldung.autoservice.BingTranslationServiceProvider
com.baeldung.autoservice.GoogleTranslationServiceProvider

3.3。 @AutoService实战

现在,一切就绪。让我们通过ServiceLoader加载提供程序:

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

ServiceLoader将加载配置文件中定义的每个提供程序。

让我们检查已加载的提供程序计数:

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

换句话说,ServiceLoader已加载所有提供程序实例。因此,选择其中之一是我们的工作。

现在,让我们选择一个提供程序,然后调用service方法以查看加载程序是否按预期工作:

1
2
3
4
5
6
7
8
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项目上获得本教程的源代码。