我遇到了文档,ServiceLoader
但不清楚它适合哪些用例。
什么时候使用ServiceLoader
?
当您希望您的程序具有“插件”功能时,您可以使用 ServiceLoader。当您希望允许人们通过将 jar 文件添加到包含特定功能子集的实现的类路径来自定义您的应用程序时,您可以使用 ServiceLoader 在类路径中查找这些实现。
ServiceLoader 本身就是jar SPI 规范的实现,它已经存在了很长时间。(我相信它是在 Java 1.3 中引入的。)
Java SE 已经在很多地方使用它来达到这个目的,包括:
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
当我听到一些关于ServiceLoader
的事情时,我首先想到的是JDBC
。该技术提供从类路径加载 JDBC 驱动程序类,而无需使用Class.forName(Class<?>clazz)
.
另外,我相信ServiceLoader
除了JDBC之外还有很多使用的例子