【发布时间】:2018-09-06 12:59:08
【问题描述】:
我遇到了the documentation of ServiceLoader,但不清楚它适合哪些用例。
什么时候会使用ServiceLoader?
【问题讨论】:
标签: java serviceloader
我遇到了the documentation of ServiceLoader,但不清楚它适合哪些用例。
什么时候会使用ServiceLoader?
【问题讨论】:
标签: java serviceloader
当您希望您的程序具有“插件”功能时,您可以使用 ServiceLoader。当您希望允许人们通过将 jar 文件添加到包含特定功能子集的实现的类路径来自定义您的应用程序时,您可以使用 ServiceLoader 在类路径中查找这些实现。
ServiceLoader 本身就是jar SPI specification 的实现,它已经存在了很长时间。 (我相信它是在 Java 1.3 中引入的。)
Java SE 已经在很多地方使用它来达到这个目的,包括:
【讨论】:
classLoader.getResources("/META-INF/services/" + spiClass.getName()) 之类的东西。
ServiceLoader 是 Java 的轻量级替代品,可替代 Spring、Guice 等成熟的 IoC 容器。它比那些框架少花哨,但在您只想找到什么的基本用例中效果很好类实现一个接口。
大部分应用服务器都会有一些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
【讨论】:
你熟悉"Inversion of Control"的原理吗?
Java 由 ServiceLoader 实现。该类旨在定位类路径上接口的实现类。你传入一个服务接口,你会得到该服务的一个实现。
您可能会找到一个很好的实用示例here。
P.S:尽管它是一个开箱即用的解决方案和一个非常简单的工具,但与 Spring IoC Container 和 Google Guice 相比,我认为它已经过时且不够灵活。 p>
【讨论】:
当我听到有关ServiceLoader 的消息时,我首先想到的是JDBC。该技术提供从类路径加载 JDBC 驱动程序类,而不使用 Class.forName(Class<?>clazz)。
另外,我相信除了JDBC
之外,还有很多使用ServiceLoader的例子
【讨论】: