JNDIの目的は何ですか


90

JNDIの使用法をどのように実現できますか、可能な場合は例を挙げてください。


3
あなたは、ユースケースのための個人的なブログの記事をチェックすることができます。tshikatshikaaa.blogspot.com/2013/01/...
ジェローム・Verstrynge

@JVerstry +1は、関連するLDAP、JCA、およびCCIについて述べている記事を指すためのものです。
アジェイ2013

回答:


109

JNDIは、Javaネーミングおよびディレクトリインターフェイスです。アプリケーションの懸念を分離するために使用されます開発者とアプリケーションデプロイヤます。データベースに依存するアプリケーションを作成しているときは、そのデータベースに接続するためのユーザー名やパスワードを気にする必要はありません。JNDIを使用すると、開発者はデータベースに名前を付け、その名前をデータベースの実際のインスタンスにマップするためにデプロイヤに依存することができます。

たとえば、Java EEコンテナで実行するコードを記述している場合、これを記述して、JNDI名が「データベース」のデータソースを取得できます。


DataSource dataSource = null;
try
{
    Context context = new InitialContext();
    dataSource = (DataSource) context.lookup("Database");
}
catch (NamingException e)
{
    // Couldn't find the data source: give up
}

ここでは、データベースドライバー、ユーザー名、またはパスワードについては何もありません。それはコンテナ内で構成されます。

JNDIはデータベース(JDBC)に限定されません。あらゆる種類のサービスに名前を付けることができます。詳細については、Oracleのチュートリアルをご覧ください


10
したがって、この画像の例では、JNDIは、データベース名を構成xmlファイルまたはプロパティファイルに配置し、そこから読み取るのとどのように違うのでしょうか。
Ajay、

11
まず、パスワードをプレーンテキストで設定ファイルに保存する必要があります。次に、同じデータベースを指すアプリがいくつかあり、データベース構成の変更について何かがある場合は、複数の場所で構成を更新する必要があります。
Simon Nickerson、

1
さて、JNDIはここでどのように役立ちますか?
Ajay、

1
これには、J2EEコンテキストかJavaSEコンテキストかに関係なく、JNDIについて知っておく必要があるすべてが含まれているはずです。javaworld.com/javaworld/jw-04-2002/jw-0419-jndi.html
ニコ

5
@SimonNickersonこんにちは!JNDIについて学習しています。これは良い答えですが、「JNDIの使用法をどのようにして実現できるのか」という質問に気付いた場合は、その後、それは未完成に見えます。あなたは実現を開発者の観点から説明しました。デプロイヤーの視点はどうですか?
lxknvlk 2015年

30

JNDIは、設定情報の整理と、を使用したサービスの検出とリッスンの両方のための非常に強力なメカニズムですEventContext。JNDI では、JNDIサービスプロバイダーがサポートしていることを前提として、任意のオブジェクト(DataSources だけでなく)をルックアップしてリッスンできます。

もちろん、唯一の問題は、実際にはJNDIサービスプロバイダーがあることです。これの素晴らしいところは、自分でロールするのが驚くほど簡単なことです。すべての後には、エンコードすることができます任意のJavaインスタンスをXMLのJavaBeansを使用XMLEncoderし、XMLDecoder:あなたは、アプリケーション・サーバー内で実行されているに頼る必要はありません!

では、これと設定ファイルの違いは何ですか?まあ、すべてのアプリケーションが同じ場所から設定を取得できるので、それははるかにきれいにすることができます。構成情報(データベースの場所など)を共有する必要がある場合、これはJNDIで一度定義できます。データベースサーバーを移動したとします。その場所が記載されているgazillion構成ファイルを覚えておく必要はありません。1つの場所、JNDIに移動します。


これは、最も明確な説明です。oxbow_lakesに感謝します。ところで、あなたが示唆するようにJavaインスタンスがエンコードされているコードポインタはありますか?
Rohan Kumar

13

JNDIは、ディレクトリおよびネーミングサービスにアクセスするために使用されるAPI(つまり、名前がオブジェクトに関連付けられる方法)です。名前とオブジェクトの関連付けは、バインディングと呼ばれます。

ネーミングサービスの基本的な例は、マシン名をIPアドレスにマップするDNSです。

JNDIを使用すると、アプリケーションは任意のタイプの名前付きJavaオブジェクトを格納および取得できます。

これは、javaのコンテキスト内で、環境固有の変数をハードコーディングしたくない構成ファイルで使用できます。

春の例:

Springコンテキストファイル

<bean id="WSClientConfig" class="com.example.BaseClientConfigImpl">
<property name="protocol">
    <jee:jndi-lookup jndi-name="java:comp/env/protocol" />
</property>
<property name="endpoint">
    <jee:jndi-lookup jndi-name="java:comp/env/endpoint" />
</property>
<property name="requestPath">
<jee:jndi-lookup jndi-name="java:comp/env/requestPath" />    
</property>

Tomcatコンテキストファイル

<Environment name="protocol" type="java.lang.String" value="https://"/>
<Environment name="endpoint" type="java.lang.String" value="172.0.0.1"/>
<Environment name="requestPath" type="java.lang.String" value="/path/to/service"/>

3

JNDIを使用すると、リソース構造を名前に単純化できます。したがって、利便性/セキュリティなどのために、多くの詳細グループが1つにまとめられています。(別名抽象化レイヤー)

実現: Jndi Context Interfaceの事前定義フィールドに対応するプロパティリストを設定します。(これらのプロパティはjndi実行の設定を指定しますが、*検索名は指定しません)

Properties props = new Properties();
//field Context.INITIAL_CONTEXT_FACTORY => property name java.naming.factory.initial
    //field Context.PROVIDER_URL => property name java.naming.provider.url
props.load(new FileInputStream("*properties file*")); //prop file in this case

Context ctx = new InitialContext(props);
    Object o = ctx.lookup("*name of resource*");

理想的には、組織でLDAPディレクトリ、DNSなどを維持するための特別な機能が存在します(統一された単一のマッピングセットがすべてにサービスを提供し、差異を減らします)。

JNDIサービスプロバイダーのリスト:https : //www.ibm.com/support/knowledgecenter/en/SSVSD8_8.4.1/com.ibm.websphere.dtx.adapjndi.doc/concepts/c_jndi_JNDI_Service_Providers_.htm

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.