我遇到了the documentation of ServiceLoader
,但不清楚它适合什么用例。
一个人何时使用ServiceLoader
?
答案 0 :(得分:2)
当您希望程序具有“插件”功能时,可以使用ServiceLoader。如果要允许人们通过将jar文件添加到包含特定功能子集的实现的jar路径中来自定义应用程序,则可以使用ServiceLoader在classpath中查找那些实现。
ServiceLoader本身是jar SPI specification的实现,已经存在很长时间了。 (我相信它是Java 1.3中引入的。)
Java SE已经在很多地方将其用于此目的,
答案 1 :(得分:-1)
您熟悉"Inversion of Control"的原理吗?
Java通过ServiceLoader
实现了它。该类旨在在类路径上找到接口的实现类。传递服务接口,即可获得该服务的实现。
您可能会找到一个很好的实用示例here。
PS:尽管它是一个即用的解决方案和一个非常简单的工具,但与Spring IoC Container和Google Guice相比,我认为它已经过时且不够灵活。 >
答案 2 :(得分:-1)
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
答案 3 :(得分:-2)
当我听到有关ServiceLoader
的信息时,我想到的第一件事就是JDBC
。此技术提供了从类路径加载JDBC驱动程序类的功能,而无需使用Class.forName(Class<?>clazz)
。
此外,我敢肯定,在 JDBC
旁,还有许多使用ServiceLoader
的示例。