可能な場合の例を使用して、どのようにJNDIの使用を実現できますか?
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 を確認してください。
JNDIは、構成情報の編成とサービスの検出とリッスンの両方を使用してEventContext
を使用するための非常に強力なメカニズムです。 JNDIでは、JNDIサービスプロバイダーがサポートしていると仮定して、anyオブジェクト(DataSource
sだけでなく)をルックアップおよびリッスンできます。
もちろん、唯一の問題は実際にJNDIサービスプロバイダーを持っていることです。これの素晴らしいところは、驚くほど簡単に自分のロールをロールバックできることです。やっぱりany Java instanceにJavaBeans XML
とXMLEncoder
を使用してXMLDecoder
にエンコードできます:必要ありませんアプリケーションサーバー内での実行に依存します。
それでは、これと設定ファイルの違いは何ですか?すべてのアプリケーションが同じ場所から設定を取得できるため、かなりクリーンになります。構成情報(データベースの場所など)を共有する必要がある場合は、これはJNDIで1回定義できます。データベースサーバーを移動したと仮定します。場所が含まれるgazillionの構成ファイルを覚えておく必要はありません。 1つの場所、JNDIに移動するだけです。
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"/>
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