Java™ Naming and Directory Interface™

Java Naming and Directory Interface™ テクノロジ (JNDI) は、複数のネームサービスおよびディレクトリサービスに統一されたインタフェースを提供します。JNDI は、Java Enterprise API セットの一部として、異機種エンタープライズネームサービスおよびディレクトリサービスへのシームレスな接続を可能にします。開発者は、この業界標準のインタフェースを使用して、強力で、移植性があり、ディレクトリ機能を備えた Java アプリケーションを構築できるようになりました。

JNDI の仕様は、米国 Sun Microsystems, Inc. が、Novell、Netscape、SCO、BEA を含む、業界をリードする多数のパートナーとともに開発しました。

Duke アイコン バージョン 1.2 の仕様およびリファレンス実装は、Java Software の Web サイトからダウンロードできます。


技術の概要

ディレクトリサービスは、ユーザー、マシン、ネットワーク、サービス、およびアプリケーションに関するさまざまな情報へのアクセスを提供することによって、イントラネットおよびインターネットにおいて重要な役割を果たします。その性質上、ディレクトリサービスには、さまざまなエンティティーの配置と識別を特徴づける、人間が理解できる名前空間を提供するためのネーミング機能が組み込まれています。

企業のコンピューティング環境は通常、合成の名前空間のさまざまな部分を表すいくつかのネーミング機能で構成されています。たとえば、インターネットのドメインネームシステム (DNS) は、企業内のさまざまな組織のトップレベルのネーミング機能として使用されることがあります。各組織では、LDAP、NDS、NIS などのディレクトリサービスを使用します。ユーザーの観点から見ると、合成名で構成される 1 つの名前空間があるように見えます。合成名の例として、URL を挙げることができます。URL は、複数のネーミング機能の名前空間にまたがっています。ディレクトリサービスを使用するアプリケーションでは、このユーザーの観点をサポートしなければなりません。

多くの Java アプリケーション開発者は、特定のディレクトリまたはネームサービスの実装から独立しているだけでなく、複数のネーミング機能を経由したディレクトリオブジェクトへのシームレスなアクセスも可能にするディレクトリサービス API からメリットを得ることができます。たとえば、アプリケーション自体のオブジェクトを、名前空間に添付できます。このネーミング機能を使用して、Java アプリケーションから、任意の型のオブジェクトの検出および取り出しを行うことができます。

JNDI は、Java アプリケーションにディレクトリ機能とネーミング機能を提供します。JNDI は、特定のディレクトリサービス実装に依存しないように定義されています。そのため、さまざまなディレクトリ (インストール済みマシン内の新規および既存のディレクトリ) に共通の方法でアクセスできます。

JNDI ではまた、さまざまなディレクトリおよびネームサービスのドライバのプラグインを可能にするサービスプロバイダのインタフェースも定義されます。

次に、JNDI のより一般的に使用される機能のいくつかを簡単に示す 2 つの例について説明します。

プリンタにアクセスするアプリケーションには、対応するプリンタオブジェクトが必要です。この対応付けは、次のようにして行います。

prt = (Printer)
        building7.lookup("puffin");
prt.print(document);

ここで、building7 は、プリンタを参照するための便利なコンテキストを提供する、物理的な構築を表すネーミングコンテキストです。

プリンタオブジェクトを構築するために必要な情報を検索する作業はすべて、JNDI が実行します。

もう 1 つの例として、組織のディレクトリに格納されているユーザーの電話番号を検索するアプリケーションは、次のように記述できます。

String[] attrs = {"workPhone", "cellPhone", "faxNumber"};
bobsPhones = directory.getAttributes("cn=Bob,o=Widget,c=US", attrs);

「Widget」という組織に「Bob」という名前のユーザーが複数存在する場合は、次のようにすれば、アプリケーションで組織のディレクトリを検索して正しい「Bob」を見つけることができます。

bob = directory.search("o=Widget,c=US","(cn=Bob)", controls);

その他のアプリケーションの例には、企業全体にわたるディレクトリサービスに格納されているセキュリティーの資格へのアクセス、電子メールアドレスへのアクセス、およびデータベースやネットワークファイルシステムなどの既存の多様なサービスのアドレスへのアクセスが含まれます。

インタフェースの概要

ネーミングインタフェース - javax.naming

Context は、ネーミングコンテキストを指定するコアインタフェースです。名前からオブジェクトへのバインディングの追加、指定された名前にバインドされているオブジェクトの検索、バインディングの一覧表示、名前からオブジェクトへのバインディングの削除、同じ型のサブコンテキストの作成および破棄などの基本操作が定義されます。

Context.lookup() は、もっとも一般的に使用される操作です。このコンテキストの実装は、Java アプリケーションに必要なクラスのオブジェクトを返すことができます。たとえば、アプリケーションがプリンタの名前を使用して対応する Printer オブジェクトを検索したあと、そこに直接印刷することがあります。

Printer printer = (Printer)
 ctx.lookup("treekiller");
printer.print(report);

アプリケーションは、どのネームサービスの実装にも公開されません。また、新しい型のネームサービスを導入するときに、アプリケーションを変更したり、実行中のアプリケーションを中断する必要はありません。

ディレクトリインタフェース - javax.naming.directory

ディレクトリオブジェクトと属性。DirContext インタフェースは、ディレクトリオブジェクトに関連付けられた属性の検査および更新を行うメソッドを定義して、ディレクトリの機能を使用可能にします。各ディレクトリオブジェクトには、Attribute クラスの 0 個以上のオブジェクトのセットが含まれています。各属性は、文字列の識別子で識別されます。また、任意の型の値を 0 個以上指定できます。

ネーミングコンテキストとしてのディレクトリオブジェクト。DirContext インタフェースは、Context インタフェースを拡張することによってネーミングコンテキストとしても動作します。つまり、任意のディレクトリオブジェクトからネーミングコンテキストを提供できます。さまざまなユーザー情報を保持しているディレクトリオブジェクトは、プリンタ、ファイルシステム、カレンダなど、個人にかかわるリソースの本来のネーミングコンテキストにもなります。

検索。DirContext インタフェースでは、コンテンツベースのディレクトリ検索がサポートされています。もっとも簡単で一般的な例として、アプリケーションで、特定の値を設定したいくつかの属性を指定して、照合に使用できます。この場合は、そのディレクトリオブジェクトに対して DirContext.search() メソッドが呼び出され、これにより、一致するディレクトリオブジェクトが要求された属性とともに返されます。

イベントインタフェース - javax.naming.event

ネーミングイベントNamingEvent クラスは、ネームサービスまたはディレクトリサービスによって生成されたイベントを表します。NamingEvent の例には、ディレクトリエントリの属性への変更や、ディレクトリエントリの名前の変更があります。

ネーミングリスナーNamingListener は、NamingEvent の影響を登録するオブジェクトです。リスナーは、コンテキスト、その子、またはそのサブツリー内の変更の通知を受信するために、そのコンテキストに登録します。

LDAP インタフェース - javax.naming.ldap

LdapContext インタフェースを使用すると、アプリケーションは、より汎用的な DirContext インタフェースではまだサポートされていない LDAP v3 固有の機能 (拡張機能コントロールを含む) を使用できます。

サービスプロバイダインタフェース - javax.naming.spi

JNDI SPI は、さまざまなネームサービスまたはディレクトリサービスプロバイダがその実装を開発し、接続することによって、対応するサービスに JNDI を使用するアプリケーションがアクセスできるようにするための手段を提供します。さらに、JNDI では複数の名前空間にまたがる名前を指定できるため、あるサービスプロバイダ実装が操作を完了するために別のサービスプロバイダ実装と対話する必要がある場合は、SPI によって、クライアントの JNDI 操作を完了するために異なるプロバイダ実装が連携できるようにするメソッドが提供されます。



Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.