2009-07-29 59 views
5

我最近发布了一个question关于在客户端定义抽象服务实现的方法。JAVA 6 ServiceLoader

dfa提到java.util.ServiceLoader作为我的问题的解决方案。

我最终以类似的方式进入,虽然没有直接使用ServiceLoader,主要是因为我使用的是JDK 5.但是当dfa提到ServiceLoader时,另一个SOer突然进入了恐慌状态。

我想知道什么是ServiceLoader实现的主要问题。虽然有限,但似乎是一个很好的方法来解决这个问题,而不会在像Guice

+2

这个问题是有点老了,但如果有人在将来发现这一点,这个回答另一个问题可能能够解释为什么的ServiceLoader不太好一些轻:HTTP:/ /stackoverflow.com/questions/7039467/java-serviceloader-with-multiple-classloaders/7237152#7237152 – Dogmatixed 2011-09-08 14:31:40

回答

2

这样的第三方库上完全没有像Spring或Guice这样的完全依赖注入框架。它旨在延迟加载服务,可以在运行时进行部署。因此ServiceLoader对插件特别有用。

要获得完整答案,您必须询问Tom Hawtin Tackline

+0

我的感觉完全一样,这就是我发布这个问题的原因。了解,如果有的话,背后的不喜欢这个功能的原因 – 2009-07-29 16:09:11

4

ServiceLoader已添加到JDK6中的java.util,之前在Service类中使用了基本技术。

ServiceLoader和DI框架解决类似的问题,但不是等效的技术。 ServiceLoader加载在类路径中找到的特定接口的实现。例如,如果您有一个读取Excel电子表格的程序,并且您发现读取器能够读取CSV文件(实现相同的接口),则可以将读取器放入类路径中,并将其作为程序中的选项提供并选择。 (这意味着你的代码本质上更加灵活)。

依赖注入(至少就Spring而言)需要先知道在类路径中找到的类以注入它。您的Spring配置文件需要修改,以便利用添加到类路径中的任何其他实现。它不能简单地通过重新启动服务器来选择它们。

1

忽略各种performance complaints and class loader issues ServiceLoader的真正体系结构问题基本上退化为Service locator pattern以及服务定位器模式(静态初始化程序)带来的所有常见问题。因此,有些人认为服务定位器模式是邪恶的,并且使用完整的DI或插件框架更好,尤其是因为@Inject现在已经标准化。

因此,一些替代方案: