Java Naming and Directory Interface

Java Naming and Directory Interface（JNDI）は、ディレクトリ・サービスが提供するデータやオブジェクトを名前で発見 (discover) し、参照 (lookup) するのためのAPIである。他の全てのJava APIと同様、JNDIは他システムに対するインターフェースであり、具体的な実装からは独立している。またJNDIにはサービスプロバイダインタフェース (SPI) が規定されており、フレームワークにディレクトリ・サービスの実装をプラグインすることができる。ディレクトリ・サービスの実装はサーバでもフラットファイルでもデータベースでもよく、サービスの提供側が任意に選択できる。

 背景 
Java RMIやJakarta EEは、ネットワーク上のオブジェクトを参照するためにJNDI APIを使用している。Jiniは独自のルックアップサービスを持っており、JNDIは使用していない。

JNDI APIには以下のものが含まれる。
 名前とオブジェクトを結びつける機構
 多様な照会方法に対応する階層構造の参照インターフェース
 要素がいつ更新されたかをクライアントに通知するイベントインターフェース
 LDAPの追加要件に対応するLDAP拡張

SPIにより、以下のようなあらゆるネーミング・サービスやディレクトリ・サービスに対応している。
 LDAP
 DNS
 NIS
 RMI
 CORBAネーム・サービス
 ファイルシステム

JNDIの仕様は、サン・マイクロシステムズが1997年3月10日に公開した。現在の最新バージョンは1.2で、J2SE 1.3以降のJava SEに統合されている。

 ルックアップの基本 
JNDIは名前を階層構造で管理している。名前はどのような文字列でもよい（例:"com.mydomain.ejb.MyBean"）。Nameインターフェースを実装したオブジェクトを名前にすることも可能だが、文字列を使用する方が一般的である。ある名前に対応するオブジェクト、あるいはオブジェクトへの参照を、名前と一緒にディレクトリ・サービスに格納 (bind) することで、名前とオブジェクトが関連付けられる。

JNDI APIはオブジェクトを探す場所（これをコンテクストという）の指定方法も規定している。

典型的なルックアップ処理では、まず最初に初期コンテクストを取得する。もっとも単純なケースで言うと、特定の実装を用いて、その実装が要求するパラメータを指定して、初期コンテクストを生成する。初期コンテクストはディレクトリツリーやファイルシステムにおけるルートディレクトリのようなもので、初期コンテクストに対して名前のルックアップを行う。以下は、初期コンテクスト生成の例である。

Hashtable contextArgs = new Hashtable<String, String>();
// 最初にコンテクストファクトリーを指定する。
// JBossの実装やSunの実装、あるいは全く別のベンダーの実装などの中から
// どれを選ぶかという動作に相当する。
contextArgs.put( Context.INITIAL_CONTEXT_FACTORY, "com.jndiprovider.TheirContextFactory" );

 // 次に、データ保存場所のURLを指定する。
contextArgs.put( Context.PROVIDER_URL, "jndiprovider-database" ); 

// (ここでなんらかの認証が必要な場合もある。)

 // 次に、初期コンテクストを生成する。
Context myCurrentContext = new InitialContext(contextArgs);

いったん初期コンテクストが取得できると、それに対して名前と結び付けられたオブジェクトをルックアップできる。

MyBean myBean = (MyBean)  myCurrentContext.lookup("com.mydomain.MyBean");

上のコードに対する別法を次に示す：

Context オブジェクトは、初期コンテクスト・ファクトリー・クラス名とプロバイダURLを書いた jndi.properties ファイルをクラスパス内に追加することによって設定することもできる。すると、上記のコードは下記のように短くできる:

//初期コンテキストを作るだけでよい。これでクラスパスからjndi.properties ファイルを読みにいこうとする。
Context myCurrentContext = new InitialContext();

それから、コンテキストを使って、そのコンテキストで事前に紐づけられた名前を探す。たとえば:

MyBean myBean = (MyBean)  myCurrentContext.lookup("com.mydomain.MyBean");

 検索 
「ディレクトリ」とよばれる特殊なエントリには、属性を付与することができる。ディレクトリでは、属性を指定してオブジェクトを検索できる。ディレクトリはコンテクストの一種であるが、その名前空間は、ファイルシステム内のディレクトリ構造のようにある程度限定されている。

 外部リンク 
 サンのJNDIページ(英語)

Naming and Directory Interface
Category:Java API
Category:長大な項目名