web-dev-qa-db-ja.com

JNDIの目的は何ですか

可能な場合の例を使用して、どのようにJNDIの使用を実現できますか?

87
Ajay

JNDIはJava Naming and Directory Interfaceです。アプリケーションの懸念を分離するために使用されます 開発者 およびアプリケーション デプロイヤ。データベースに依存するアプリケーションを作成している場合、そのデータベースに接続するためのユーザー名やパスワードを心配する必要はありません。 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)に限定されません。あらゆる種類のサービスに名前を付けることができます。詳細については、このテーマの Sun tutorial を確認してください。

104
Simon Nickerson

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

もちろん、唯一の問題は実際にJNDIサービスプロバイダーを持っていることです。これの素晴らしいところは、驚くほど簡単に自分のロールをロールバックできることです。やっぱりany Java instanceにJavaBeans XMLXMLEncoderを使用してXMLDecoderにエンコードできます:必要ありませんアプリケーションサーバー内での実行に依存します。

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

29
oxbow_lakes

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

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

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

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

春の例:

スプリングコンテキストファイル

<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"/>
11
Ithar

JNDIでは、リソース構成をnameに単純化できます。したがって、多くの詳細groupが便利/セキュリティ/その他のために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

3
ilupper