Mümkünse bir örnekle JNDI kullanımını nasıl gerçekleştirebilirsiniz?
Mümkünse bir örnekle JNDI kullanımını nasıl gerçekleştirebilirsiniz?
Yanıtlar:
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 .
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 XML
JavaBeans kullanarak XMLEncoder
ve 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.
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"/>
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