可能であれば例を挙げて、どのように JNDI の使用法を理解できますか?
4 に答える
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 のチュートリアルをご覧ください。
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 コンテキスト インターフェイスの定義済みフィールドに対応するプロパティ リストを設定します。(これらのプロパティは、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