98

可能であれば例を挙げて、どのように JNDI の使用法を理解できますか?

4

4 に答える 4

120

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

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


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 のチュートリアルをご覧ください。

于 2009-08-29T08:21:42.413 に答える
15

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"/>
于 2014-03-28T12:41:32.287 に答える
4

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

実現するには: Jndi コンテキスト インターフェイスの定義済みフィールドに対応するプロパティ リストを設定します。(これらのプロパティは、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

于 2012-06-13T02:31:12.903 に答える