Bagaimana Anda bisa menyadari penggunaan JNDI, dengan contoh jika memungkinkan?
Bagaimana Anda bisa menyadari penggunaan JNDI, dengan contoh jika memungkinkan?
Jawaban:
JNDI adalah Penamaan Java dan Antarmuka Direktori. Ini digunakan untuk memisahkan kekhawatiran dari aplikasi pengembang dan aplikasi deployer . Saat Anda menulis aplikasi yang bergantung pada database, Anda tidak perlu khawatir tentang nama pengguna atau kata sandi untuk menghubungkan ke database itu. JNDI memungkinkan pengembang untuk memberikan nama ke database, dan mengandalkan deployer untuk memetakan nama tersebut ke instance database yang sebenarnya.
Misalnya, jika Anda menulis kode yang dijalankan dalam penampung Java EE, Anda dapat menulis ini untuk mendapatkan sumber data dengan nama 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
}
Perhatikan bahwa tidak ada apa pun di sini tentang driver database, atau nama pengguna, atau kata sandi. Itu dikonfigurasi di dalam penampung.
JNDI tidak terbatas pada database (JDBC); segala macam layanan bisa diberi nama. Untuk lebih jelasnya, Anda harus melihat tutorial Oracle .
JNDI adalah mekanisme yang sangat kuat untuk mengatur informasi konfigurasi dan menemukan serta mendengarkan layanan melalui penggunaan EventContext
. Di JNDI Anda dapat mencari dan mendengarkan objek apa pun (tidak hanya DataSource
), dengan asumsi penyedia layanan JNDI Anda mendukungnya.
Tentu saja, satu-satunya masalah sebenarnya adalah memiliki penyedia layanan JNDI; hal yang hebat tentang ini adalah sangat mudah untuk menggulung sendiri. Lagi pula, Anda dapat menyandikan setiap instance Java ke dalam XML
menggunakan JavaBeans XMLEncoder
dan XMLDecoder
: Anda tidak perlu mengandalkan menjalankan dalam server aplikasi!
Jadi apa perbedaan antara ini dan memiliki file konfigurasi? Yah, ini bisa jauh lebih bersih karena semua aplikasi Anda bisa mendapatkan konfigurasinya dari tempat yang sama . Jika mereka perlu berbagi informasi konfigurasi (mis. Lokasi database) maka ini dapat ditentukan satu kali di JNDI . Misalkan Anda memindahkan server database: Anda tidak perlu mengingat trilyun file konfigurasi dengan lokasi di dalamnya. Anda tinggal pergi ke satu tempat: JNDI.
JNDI adalah API yang digunakan untuk mengakses direktori dan layanan penamaan (yaitu cara yang menghubungkan nama dengan objek). Asosiasi nama dengan objek disebut pengikatan.
Contoh dasar dari layanan penamaan adalah DNS yang memetakan nama mesin ke alamat IP.
Menggunakan JNDI, aplikasi dapat menyimpan dan mengambil objek Java jenis apa pun.
Dalam konteks java ini dapat digunakan dalam file konfigurasi di mana Anda tidak ingin variabel spesifik lingkungan hard-code.
Contoh Musim Semi:
File konteks pegas
<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>
File konteks 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 memungkinkan penyederhanaan konstruksi sumber daya menjadi hanya sebuah nama . Jadi, banyak detail yang dikelompokkan menjadi 1 untuk kenyamanan / keamanan / dll. (alias lapisan abstraksi)
untuk menyadari: mengatur daftar properti yang sesuai dengan bidang yang telah ditentukan di Antarmuka Konteks Jndi. (properti ini menentukan pengaturan untuk eksekusi jndi; tetapi * bukan nama pencarian)
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*");
idealnya, fungsi khusus akan ada untuk memelihara direktori LDAP, DNS, dll, di organisasi Anda (jadi satu set pemetaan terpadu melayani semua, mengurangi perbedaan)
Daftar Penyedia Layanan 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