JNDIは、オブジェクトに名前をつけて管理するネーミングサービスの共通インターフェースを提供します。JAVAアプリケーションはこのJNDIを使って統一された手法でネーミングサービスにアクセスすることができます。

JNDI(Java Naming and Directory Interface)とは、Javaでネーミングサービスを扱うためのAPIを定めたものです。JNDIが定められた目的はアプリケーションがさまざまなネーミング/ディレクトリサービスを統一的に利用することができるようにすることです。

ネーミングサービスとは、名前とオブジェクトを関連付けて管理するサービスのことです。例えば 管理人 => 「ハマショウというオブジェクト」 というように、管理人という名前をハマショウというオブジェクトに結び付け、管理人 = ハマショウという関連を作ることと説明できます。

このネーミングサービスの例として、データベースへのコネクションをプーリングして管理するデータソースに名前をつけて、WebアプリケーションからJNDIを利用してデータソースを取得するという手法が良く使われます。

JNDIの仕組み

JNDIはService Provider Interface(SPI)とこれにアクセスするためのAPIを提供します。SPIは主にネーミング/ディレクトサービスを提供するサードパティのためのもので、このインターフェースにしたがっているサービスをAPIからアクセスすることができるようになります。

ディレクトリサービスとは、ネーミングをディレクトリ階層で管理するものです。

身近な例を出すと、ファイル管理システムがあります。Linuxを思い浮かべるとわかると思いますが、ルートディレクト(/)があり、その下にサブディレクトリ(etc, usr, home)ディレクトリ、その下にさらにサブディレクトリとファイルが存在しています。index.htmlファイルにアクセスするにはLinuxのファイルディレクトリサービスを呼び出して、/home/hamasyou/index.html という名前でアクセスすることになります。

これが、ネーミング/ディレクトサービスの概要です。このようなサービスをデータソースの検索に利用したのが、先ほどの例であげたデータベース接続の取得などになります。

JNDIの用語

JNDIに出てくる用語として名前、コンテキスト、イニシャルコンテキスト、名前空間、ディレクトサービスというのがあります。

名前
オブジェクトを識別するためのものです。ネーミングサービスはこの名前を使ってオブジェクトを管理します。
コンテキスト
名前とオブジェクトを結びつけた集合をコンテキストといいます。ファイル管理の例で言うところの、ディレクトリに当たります。コンテキストには、サブコンテキストを含めることもできます。ネーミングサービスはこのコンテキストからオブジェクトを取り出します。
イニシャルコンテキスト
コンテキストルートのことです。ファイル管理の例で言うところの、ルートディレクトリになります。このイニシャルコンテキストから、ネーミングサービスはオブジェクトの検索を始めます。
名前空間
コンテキストの集合、つまりひとつのディレクトリサービスを識別するものが名前空間となります。
ディレクトリサービス
ネーミングサービスの多くはディレクトリサービスを提供しています。このディレクトリサービスはオブジェクトに名前をつけて管理するだけでなく、属性をつけることもできます。これも、ファイルシステムを思い浮かべればよいでしょう。ファイルには日付やアクセス許可などの属性がついています。

JAVAでのコーディング例

こちらのサイトで詳しく説明しているので、ご覧ください。

JavaでHelloWorld JNDI編

まとめ

JNDIはネーミング/ディレクトリサービスにアクセスするための統一的な方法を提供します。また、アクセスするだけでなく、オブジェクトの格納も行うことができます。これらのネーミング/ディレクトリサービスは、サードパティから入手することができます。

例えば、WebアプリケーションでデータソースをJNDIで取得するネーミング/ディレクトリサービスは、Tomcatなどに実装されています。

ネーミング/ディレクトリサービスを使って、アプリケーションに統一的なオブジェクトアクセスの方法を導入することで、別の環境に移った場合でも、ソースコードを変更することなく、環境の整備だけで対処することができます。ネーミング/ディレクトリサービスの種類はたくさんあるので、探してみるのも面白いでしょう。

参考

  • JNDIを使ってHello Worldを表示させるもの。詳しく書いてあって、サンプルを打ち込むだけでも良くわかります。

JavaでHelloWorld JNDI編

  • JNDIを使って、JDBCコネクションプーリングを行う手順を説明しています。(Web+Tomcat)

@IT: JNDI活用でデータソース管理を一元化する

  • JDBC接続をDataSouceで管理する方法

JavaでHelloWorld DataSource編

  • JNDIだけでなく、J2EEで使われている技術全般に関して説明しています。