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