0

我遇到了文档,ServiceLoader但不清楚它适合哪些用例。

什么时候使用ServiceLoader

4

4 回答 4

3

当您希望您的程序具有“插件”功能时,您可以使用 ServiceLoader。当您希望允许人们通过将 jar 文件添加到包含特定功能子集的实现的类路径来自定义您的应用程序时,您可以使用 ServiceLoader 在类路径中查找这些实现。

ServiceLoader 本身就是jar SPI 规范的实现,它已经存在了很长时间。(我相信它是在 Java 1.3 中引入的。)

Java SE 已经在很多地方使用它来达到这个目的,包括:

于 2018-09-06T14:55:26.903 回答
-1

您熟悉“控制反转”的原理吗?

Java 通过ServiceLoader. 该类旨在定位类路径上接口的实现类。您传入一个服务接口,您将获得该服务的一个或多个实现。

您可能会在此处找到一个很好的实际示例。


PS:尽管它是一个开箱即用的解决方案和一个非常简单的工具,但与 Spring IoC Container 和 Google Guice 相比,我认为它已经过时且不够灵活。

于 2018-09-06T13:14:48.273 回答
-1

ServiceLoader是 Java 的轻量级替代品,可替代完整的 IoC 容器,例如 Spring、Guice 等。它比那些框架少花哨,但在您只想查找哪些类实现接口时非常适用于基本用例。

大多数应用服务器都会有一些 ServiceLoader 的用法,你可以在实践中看到:

https://github.com/apache/tomee/search?q=ServiceLoader&unscoped_q=ServiceLoader

https://github.com/apache/tomcat/search?q=ServiceLoader&unscoped_q=ServiceLoader

https://github.com/wildfly/wildfly/search?q=ServiceLoader&unscoped_q=ServiceLoader

于 2018-09-06T13:19:09.167 回答
-2

当我听到一些关于ServiceLoader的事情时,我首先想到的是JDBC。该技术提供从类路径加载 JDBC 驱动程序类,而无需使用Class.forName(Class<?>clazz).

另外,我相信ServiceLoader除了JDBC之外还有很多使用的例子

于 2018-09-06T13:06:22.273 回答