作为一个对依赖性过敏的人,我什么时候会使用OSGi而不是内置的Java 6 http://java.sun.com/javase/6/docs/api/java/util/ServiceLoader.html(我想让插件JAR文件可以随意添加)。
(顺便说一下,这是在Scala应用程序中,欢迎任何建议,ServiceLoader非常接近我想要的)。
作为一个对依赖性过敏的人,我什么时候会使用OSGi而不是内置的Java 6 http://java.sun.com/javase/6/docs/api/java/util/ServiceLoader.html(我想让插件JAR文件可以随意添加)。
(顺便说一下,这是在Scala应用程序中,欢迎任何建议,ServiceLoader非常接近我想要的)。
ServiceLoader
适合您的需求,那说明您正在寻找通过类路径上存在文件来进行服务发现。这只是OSGi提供的功能的一小部分。ServiceLoader
只做了一件事:它公开了可发现的工厂。通常,您将创建一个工厂样式接口,该接口需要一些参数来决定是否该提供程序可以提供适当的服务,例如将给定字符集名称映射到CharsetDecoder
。对于获取和释放来自此类提供程序的服务,没有正式的协议。 OSGi规范了将消费者与服务绑定和解除绑定。当新提供程序上线时,消费者可以接收通知,而当消费者获取和释放服务实例时,提供程序可以接收通知。如果生命周期控制对您的服务很重要,而且您放弃了OSGi,那么您将不得不自己构建这个;ServiceLoader
无法做到这一点。ServiceLoader
可能会错过哪些功能。
ServiceLoader
,唯一让我感到沮丧的是:1)需要将扩展作为Jar文件推送到类路径上(我们的应用程序不鼓励最终用户对类路径进行调整),2)未指定相同服务接口的同级提供者将向消费者公开的顺序。后者使得很难融入“优先级”,例如用户提供的扩展应该优于应用程序的基本服务。因此,当提供者不会重叠或竞争时,最好使用ServiceLoader
。 - seh