我最近发布了question,它涉及一种在客户端定义抽象服务实现的方法。
dfa提到java.util.ServiceLoader作为我的问题的解决方案。
我最终采用了类似的方式,尽管没有直接使用ServiceLoader,主要是因为我使用的是JDK5。但是当dfa提到ServiceLoader时,另一个SOer陷入了恐慌。
我想知道ServiceLoader实现的主要问题是什么。尽管有局限性,但它似乎是解决此问题的好方法,而无需全力投入像Guice这样的第三方库中
最佳答案
在Service类中使用了基本技术之前,在JDK6中将ServiceLoader添加到了java.util中。
ServiceLoader和DI框架解决了类似的问题,但不是等效的技术。 ServiceLoader加载在类路径中找到的特定接口的实现。例如,如果您有一个读取Excel电子表格的程序,并且找到了一个能够读取CSV文件的读取器(实现了相同的接口),则可以将该读取器放到类路径中,并使其在程序中作为一个选项可用和可选。 (这意味着您的代码本质上更加灵活)。
依赖注入(至少就Spring而言)需要先验在其类路径中找到的类,才能进行注入。您需要修改您的Spring配置文件,以利用您添加到类路径中的所有其他实现。它不能简单地通过重新启动服务器来选择它们。