Java 什么是ServiceLoader?它是如何使用的?

Java 什么是ServiceLoader?它是如何使用的?,java,serviceloader,Java,Serviceloader,我遇到过,不清楚它适合哪些用例 什么时候会使用ServiceLoader?当我听到关于ServiceLoader的事情时,我想到的第一件事是JDBC。此技术提供了从类路径加载JDBC驱动程序类,而无需使用Class.forName(Classclazz) 另外,我确信除了JDBC之外,还有许多使用ServiceLoader的例子。您熟悉这个原理吗 Java通过ServiceLoader实现了它。该类用于在类路径上定位接口的实现类。您传入一个服务接口,就得到了该服务的一个或多个实现 你可能会找到一

我遇到过,不清楚它适合哪些用例


什么时候会使用
ServiceLoader

当我听到关于
ServiceLoader
的事情时,我想到的第一件事是
JDBC
。此技术提供了从类路径加载JDBC驱动程序类,而无需使用
Class.forName(Classclazz)


另外,我确信除了JDBC之外,还有许多使用
ServiceLoader
的例子。您熟悉这个原理吗

Java通过
ServiceLoader
实现了它。该类用于在类路径上定位接口的实现类。您传入一个服务接口,就得到了该服务的一个或多个实现

你可能会找到一个很好的实际例子



注:尽管它是一个现成的解决方案和一个非常简单的工具,但我认为它已经过时,与Spring IoC容器和Google Guice相比不够灵活。

ServiceLoader
是Java轻量级的替代品,可以替代Spring、Guice等成熟的IoC容器,它比那些框架有更少的细节,但是当你只想找到实现接口的类时,它在基本用例中工作得很好

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


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

ServiceLoader本身就是的一个实现,它已经存在很长时间了。(我相信它是在Java1.3中引入的。)

Java SE已经在很多地方使用它来实现这一目的,包括:

  • 附加字符集通过
  • 其他文件系统通过(请参阅)
  • 其他文件内容类型分析器(请参阅)
  • 其他首选项通过实现(请参阅)
  • 自定义ResourceBundle.Control通过
  • 所有子类:
    • 其他日历通过和
    • 额外货币通过
    • 其他地区通过
    • 其他时区通过
  • 其他图像格式通过
  • 其他打印机通过
  • 自定义脚本引擎通过

@AndrewTobilko是的,ServiceLoader是在1.6中引入的,作为一种方便的方式来完成jar规范多年前已经记录的内容。在ServiceLoader之前,必须使用类似于
classLoader.getResources(“/META-INF/services/”+spiClass.getName())
的东西手动执行。