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 .
Jadi dengan contoh di gambar ini, bagaimana JNDI berbeda dari menempatkan nama Database di file config xml atau file properti dan kemudian membacanya dari sana?
Ajay
11
Pertama, Anda harus menyimpan kata sandi dalam teks biasa di file konfigurasi Anda. Kedua, jika Anda memiliki beberapa aplikasi yang mengarah ke database yang sama dan sesuatu tentang konfigurasi database berubah, Anda harus memperbarui konfigurasi di banyak tempat.
@SimonNickerson Hai !. Saya sedang belajar tentang JNDI. Ini adalah jawaban yang bagus, tetapi jika Anda memperhatikan pertanyaan "Bagaimana Anda dapat menyadari penggunaan JNDI?" kemudian terlihat belum selesai. Anda menggambarkan realisasi dari perspektif pengembang. Bagaimana dengan perspektif penerapan?
lxknvlk
31
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 XMLmenggunakan JavaBeans XMLEncoderdan 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.
Ini adalah klarifikasi yang paling bulat - Terima kasih oxbow_lakes! Btw, apakah Anda memiliki penunjuk kode di mana setiap instance Java telah dikodekan seperti yang Anda sarankan?
Rohan Kumar
13
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.
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)
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 .
sumber
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 hanyaDataSource
), 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 JavaBeansXMLEncoder
danXMLDecoder
: 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.
sumber
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"/>
sumber
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
sumber