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でのコーディング例
こちらのサイトで詳しく説明しているので、ご覧ください。
まとめ
JNDIはネーミング/ディレクトリサービスにアクセスするための統一的な方法を提供します。また、アクセスするだけでなく、オブジェクトの格納も行うことができます。これらのネーミング/ディレクトリサービスは、サードパティから入手することができます。
例えば、WebアプリケーションでデータソースをJNDIで取得するネーミング/ディレクトリサービスは、Tomcatなどに実装されています。
ネーミング/ディレクトリサービスを使って、アプリケーションに統一的なオブジェクトアクセスの方法を導入することで、別の環境に移った場合でも、ソースコードを変更することなく、環境の整備だけで対処することができます。ネーミング/ディレクトリサービスの種類はたくさんあるので、探してみるのも面白いでしょう。
参考
- JNDIを使ってHello Worldを表示させるもの。詳しく書いてあって、サンプルを打ち込むだけでも良くわかります。
- JNDIを使って、JDBCコネクションプーリングを行う手順を説明しています。(Web+Tomcat)
- JDBC接続をDataSouceで管理する方法
- JNDIだけでなく、J2EEで使われている技術全般に関して説明しています。