繁体   English   中英

JAVA 6 ServiceLoader

[英]JAVA 6 ServiceLoader

我最近发布了一个关于在客户端定义抽象服务实现的方法的问题

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

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

我想知道ServiceLoader实现的主要问题是什么。 虽然有限,但似乎是解决这个问题的好方法,而不是像Guice这样的第三方图书馆

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

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

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

ServiceLoader不如Spring或Guice这样的完整依赖注入框架。 它旨在延迟加载服务,可以在运行时部署。 因此ServiceLoader对插件特别有用。

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

忽略各种性能投诉和类加载器问题 ,ServiceLoader的真正架构问题是基本上退化为服务定位器模式以及服务定位器模式(静态初始化器)带来的所有常见问题。 因此,有些人认为服务定位器模式是邪恶的,并且更好地使用完整的DI或插件框架,特别是因为@Inject现在是标准化的。

因此一些替代方案是:

sun.misc.Service

http://www.docjar.com/docs/api/sun/misc/Service.html

请注意,它不是标准J2SE API的一部分! 它是Sun JDK的非标准部分。 所以如果你使用JRockit,你就不能依赖它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM