为便于在系统的任意模块中注册和查找任何类型的接口或类,NetBeans 平台支持以下两种普遍适用的解决方案:
下面是一些决定要使用哪种方法的因素:
早期的 JDK 版本中提供了 Lookup,因此,如果要在早于 1.6 的 JDK 版本上运行,则可以使用 Lookup 来替代 ServiceLoader。
Lookup 可直接在 NetBeans 运行时容器中使用。它知道如何查找系统中的所有模块,以及如何有效地读取其定义的服务,等等。
Lookup 支持侦听程序。客户端代码可以连接侦听程序并监视查找内容的变化。为了适应 NetBeans 运行时容器创建的动态环境,这一改进是非常有必要的,在此环境中,可以在运行时启用或禁用模块,而此操作又会影响注册的服务提供器集合。
Lookup 是可扩展且可替换的。JDK 1.6 中的 ServiceLoader 类是具有固定编码行为的最终类;而 NetBeans Lookup 是具有多种不同实现的可扩展类。这在编写单元测试时非常有用。或者,您可以编写改进版本的 Lookup,使其不仅能够读取 META-INF/services,而且还能够在 Internet 上查找请求的服务提供器,等等。
Lookup 是通用的抽象类。每个类加载器事实上只能有一个 JDK ServiceLoader 实例;但可以有数千个独立的 Lookup 实例,每个实例表示一个查询服务和接口的位置。实际上,这正是在 NetBeans 中使用 Lookup 的方式,它表示每个对话框、窗口元素和树中节点等的上下文。
有关介绍 Lookup 的教程系列(包含四个部分),请参见: