サービスプロバイダについて

関連項目

バージョン 1.3 から JDK は「サービスプロバイダ」という概念を使い始めました。この概念により完全に宣言型の登録書式が導入されます。これは、Java 仮想マシンの現在のクラスパスのみに基づくものです。これには登録書式の使いやすさに大いに貢献する、重要な利点があります。一連の登録プロバイダの設定を変更するためには、プロバイダを提供している JAR ファイルを選択し、アプリケーションのクラスパスに含めるだけです。プロバイダはすぐに、そのプロバイダを検索するすべてのコードからアクセス可能になります。

基本的な考え方としては、たとえば javax.xml.parsers.DocumentBuilderFactory のような、インタフェースの実装を提供する JAR ファイル (NetBeans の用語では各モジュール) が、それ自体のインタフェースの実装 (たとえば org.sakson.MyFactory) を作成し、独自の JAR ファイルの内部に META-INF/services/javax.xml.parsers.DocumentBuilderFactory ファイルを作成することにより、サービスとしてシステムに公開します。続いてファイルには、各行に実装クラスの名前を包含します。この例の場合、sakson factory を登録する 1 行 (org.sakson.MyFactory) が含まれます。

次に DocumentBuilderFactory.newInstance メソッドがすべての META-INF/services/javax.xml.parsers.DocumentBuilderFactory ファイルを、ClassLoader.getResources("META-INF/services/javax.xml.parsers.DocumentBuilderFactory") を使用して検索し、それらの内容を読み取り、デフォルトのコンストラクタを呼び出して、見つかったクラスをインスタンス化します。DocumentBuilderFactory の最初の実装は、newInstance メソッドから返されます。

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 開発者の間でも人気を得つつあります。As a result, JDK 1.6 has introduced the new utility class java.util.ServiceLoader.

関連項目
NetBeans Platform とモジュール開発について
モジュール間の通信について

著作権と商標について