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 |
我们的应用程序将使用此接口作为扩展点。类路径上的实现将作为组件注入。
接下来,我们将使用@AutoService批注通过两个不同的翻译提供程序实现此服务:
1 2 3 4 5 6 7 8 |
1 2 3 4 5 6 7 8 |
在编译时,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项目上获得本教程的源代码。