JNDI'nin amacı nedir


Yanıtlar:


110

JNDI, Java Adlandırma ve Dizin Arayüzüdür. Uygulama geliştiricisinin ve uygulama dağıtıcısının endişelerini ayırmak için kullanılır . Bir veritabanına dayanan bir uygulama yazarken, o veritabanına bağlanmak için kullanıcı adı veya parola konusunda endişelenmenize gerek yoktur. JNDI, geliştiricinin bir veritabanına bir ad vermesine ve bu adı veritabanının gerçek bir örneğiyle eşlemek için dağıtıcıya güvenmesine izin verir.

Örneğin, bir Java EE kapsayıcısında çalışan bir kod yazıyorsanız, JNDI adı "Veritabanı" olan veri kaynağını almak için bunu yazabilirsiniz:


DataSource dataSource = null;
try
{
    Context context = new InitialContext();
    dataSource = (DataSource) context.lookup("Database");
}
catch (NamingException e)
{
    // Couldn't find the data source: give up
}

Burada veritabanı sürücüsü, kullanıcı adı veya parola hakkında hiçbir şey olmadığını unutmayın. Bu, konteynerin içinde yapılandırılmıştır.

JNDI, veritabanları (JDBC) ile sınırlı değildir; her türlü hizmete isim verilebilir. Daha fazla ayrıntı için Oracle'ın eğitimine göz atmalısınız .


10
Öyleyse, resimdeki bu örnekte, JNDI, Veritabanı adlarını bir yapılandırma xml dosyasına veya bir özellik dosyasına yerleştirip oradan okumaktan ne kadar farklıdır?
Ajay

11
Öncelikle, şifreyi yapılandırma dosyanıza düz metin olarak kaydetmeniz gerekir. İkinci olarak, aynı veritabanına işaret eden birkaç uygulamanız varsa ve veritabanı yapılandırma değişiklikleri hakkında bir şeyler varsa, yapılandırmayı birden çok yerde güncellemeniz gerekir.
Simon Nickerson

1
peki, JNDI burada nasıl yardımcı oluyor?
Ajay

1
bu ister J2EE bağlamında ister JavaSE bağlamında olsun, JNDI hakkında bilmeniz gereken her şeyi içermelidir. javaworld.com/javaworld/jw-04-2002/jw-0419-jndi.html
Nico

5
@SimonNickerson Merhaba !. JNDI hakkında öğreniyorum. Bu iyi bir cevap, ancak "JNDI kullanımını nasıl gerçekleştirebilirsiniz?" Sorusunu fark ederseniz. sonra bitmemiş görünüyor. Gerçekleştirmeyi geliştiricinin bakış açısından tanımladınız. Görevlendiricinin bakış açısı nasıl?
lxknvlk

31

Jndi organizasyon yapılandırma bilgileri ve her ikisi için de çok güçlü bir mekanizmadır hizmetlerine keşfetmek ve dinleme kullanarak yoluyla EventContext. JNDI'de , JNDI servis sağlayıcınızın desteklediğini varsayarak, herhangi bir nesneyi (sadece nesneleri değil DataSource) arayabilir ve dinleyebilirsiniz .

Tabii ki, tek sorun aslında bir JNDI hizmet sağlayıcısına sahip olmak; bununla ilgili harika olan şey, kendi başınıza dönmenin şaşırtıcı derecede kolay olmasıdır. Sonuçta sen kodlamak herhangi bir Java örneğini içine XMLJavaBeans kullanarak XMLEncoderve XMLDecoder: Bir uygulama sunucusu içinde çalışan güvenmek gerek yok!

Öyleyse bunun yapılandırma dosyalarına sahip olması arasındaki fark nedir? Pekala, çok daha temiz olabilir çünkü tüm uygulamalarınız yapılandırmalarını aynı yerden alabilir . Konfigürasyon bilgilerini paylaşmaları gerekiyorsa (örn. Veritabanı konumları), bu JNDI'de bir kez tanımlanabilir . Veritabanı sunucularını taşıdığınızı varsayalım: İçinde konum bulunan gazillion yapılandırma dosyalarını hatırlamanıza gerek yoktur. Siz sadece tek bir yere gidin: JNDI.


Bu şimdiye kadarki en kapsamlı açıklamadır - Teşekkürler oxbow_lakes! Btw, önerdiğiniz gibi herhangi bir Java örneğinin kodlandığı kod işaretçileriniz olur mu?
Rohan Kumar

13

JNDI, dizine ve adlandırma hizmetlerine (yani adların nesnelerle ilişkilendirildiği araçlar) erişmek için kullanılan bir API'dir. Bir adın bir nesneyle ilişkilendirilmesine bağlama denir.

Bir adlandırma hizmetinin temel bir örneği, makine adlarını IP adresleriyle eşleyen DNS'dir.

JNDI kullanarak, uygulamalar her türden adlandırılmış Java nesnesini depolayabilir ve alabilir.

Java bağlamında bu, ortama özgü değişkenleri sabit kodlamak istemediğiniz yapılandırma dosyalarında kullanılabilir.

Bahar Örneği:

Spring bağlam dosyası

<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 bağlam dosyası

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

3

JNDI, bir kaynak yapısının sadece bir isim halinde basitleştirilmesine izin verir . Dolayısıyla, kolaylık / güvenlik / vb. İçin birçok ayrıntı 1'e gruplandırılır . (aka soyutlama katmanı)

gerçekleştirmek için: Jndi Bağlam Arayüzündeki önceden tanımlanmış alanlara karşılık gelen bir özellikler listesi oluşturun. (bu özellikler jndi yürütmesi için ayarları belirtir; ancak * arama adını belirtmez)

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*");

ideal olarak, kuruluşunuzda bir LDAP dizini, DNS, vb. tutmak için özel bir işlev mevcut olmalıdır (bu nedenle, birleşik tek bir eşleme kümesi, tutarsızlıkları azaltır)

JNDI Servis Sağlayıcılarının Listesi: https://www.ibm.com/support/knowledgecenter/en/SSVSD8_8.4.1/com.ibm.websphere.dtx.adapjndi.doc/concepts/c_jndi_JNDI_Service_Providers_.htm

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.