关于服务提供器

另请参见

在 1.3 版中,JDK 开始使用一个名为“服务提供器”的概念。此概念引入了一种完全声明性的注册方式,它仅基于 Java 虚拟机的当前类路径,而不基于任何其他内容。它具有一个非常重要的优点,即可大大提高这种注册方式的易用性:要更改注册的提供器集合,只需选取提供此类提供器的 JAR 文件,然后将其包含在应用程序类路径中。这样,搜索其提供器的所有代码便可立即访问该提供器。

基本思路是,要提供某个接口实现(如 javax.xml.parsers.DocumentBuilderFactory)的每个 JAR 文件(在 NetBeans 术语中为每个模块)可以创建其自已的接口实现(如 org.sakson.MyFactory),然后在自己的 JAR 文件中创建 META-INF/services/javax.xml.parsers.DocumentBuilderFactory 文件以将该实现作为服务向系统公开。随后,该文件的每一行中都将包含实现类的名称。在本例中,它将包含一行用于注册 sakson 工厂的代码:org.sakson.MyFactory

接下来,DocumentBuilderFactory.newInstance 方法使用 ClassLoader.getResources("META-INF/services/javax.xml.parsers.DocumentBuilderFactory") 搜索所有 META-INF/services/javax.xml.parsers.DocumentBuilderFactory 文件,读取这些文件的内容,然后实例化在其中找到的类(通过调用其缺省构造函数)。最后,将从 newInstance 方法返回第一个 DocumentBuilderFactory 实现。

While you can manually create the registration of a service in your module, usually you will use the org.openide.util.lookup.ServiceProvider annotation, which creates such a registration for you automatically.

如上所述,这种方式是从 JDK 1.3 开始提供的,并成为一种处理服务提供器的标准方法。这种方式不仅被 NetBeans 所采用,而且也越来越受到其他 Java 开发者的欢迎。因此,JDK 1.6 引入了新的实用程序类 java.util.ServiceLoader

另请参见
关于 NetBeans 平台和模块开发
关于在模块之间进行通信

法律声明