Qual è lo scopo di JNDI


Risposte:


109

JNDI è l'interfaccia di denominazione e directory Java. Viene utilizzato per separare le preoccupazioni dello sviluppatore dell'applicazione e del deployer dell'applicazione . Quando scrivi un'applicazione che si basa su un database, non dovresti preoccuparti del nome utente o della password per la connessione a quel database. JNDI consente allo sviluppatore di assegnare un nome a un database e fare affidamento sul programma di distribuzione per associare quel nome a un'istanza effettiva del database.

Ad esempio, se stai scrivendo codice che viene eseguito in un contenitore Java EE, puoi scriverlo per ottenere l'origine dati con il nome 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
}

Nota non c'è niente qui sul driver del database, sul nome utente o sulla password. Questo è configurato all'interno del contenitore.

JNDI non è limitato ai database (JDBC); si possono dare nomi a tutti i tipi di servizi. Per maggiori dettagli, dovresti controllare il tutorial di Oracle .


10
Quindi, con questo esempio in figura, in che modo JNDI è diverso dal posizionare i nomi del database in un file xml di configurazione o in un file delle proprietà e quindi leggerlo da lì?
Ajay

11
In primo luogo, dovresti memorizzare la password in testo normale nel tuo file di configurazione. In secondo luogo, se hai diverse app che puntano allo stesso database e qualcosa sulle modifiche alla configurazione del database, devi aggiornare la configurazione in più punti.
Simon Nickerson,

1
bene, in che modo JNDI aiuta qui?
Ajay

1
questo dovrebbe contenere tutto ciò che è necessario sapere su JNDI, sia in un contesto J2EE che in un contesto JavaSE. javaworld.com/javaworld/jw-04-2002/jw-0419-jndi.html
Nico il

5
@SimonNickerson Ciao !. Sto imparando a conoscere JNDI. Questa è una buona risposta, ma se noti la domanda "Come puoi realizzare l'utilizzo di JNDI?" poi sembra incompiuto. Hai descritto la realizzazione dal punto di vista dello sviluppatore. E la prospettiva del deployer?
lxknvlk

30

JNDI è un meccanismo molto potente sia per l'organizzazione delle informazioni di configurazione che per la scoperta e l'ascolto dei servizi tramite l'utilizzo di EventContext. In JNDI è possibile cercare e ascoltare qualsiasi oggetto (non solo DataSourcei), supponendo che il proprio fornitore di servizi JNDI lo supporti.

Naturalmente, l'unico problema è effettivamente avere un fornitore di servizi JNDI; la cosa grandiosa di questo è che è sorprendentemente facile rotolare il tuo. Dopo tutto è possibile codificare qualsiasi istanza Java in XMLutilizzando i JavaBeans XMLEncodere XMLDecoder: non è necessario fare affidamento su in esecuzione all'interno di un server applicativo!

Allora qual è la differenza tra questo avere file di configurazione? Bene, può essere molto più pulito perché tutte le tue applicazioni possono ottenere la loro configurazione dallo stesso posto . Se hanno bisogno di condividere le informazioni di configurazione (ad esempio le posizioni del database), questo può essere definito una volta in JNDI . Supponiamo di aver spostato i server di database: non è necessario ricordare i gazillion file di configurazione con la posizione in essi. Devi solo andare in un posto: JNDI.


Questo è di gran lunga il chiarimento più completo - Grazie oxbow_lakes! A proposito, avresti puntatori di codice in cui qualsiasi istanza Java è stata codificata come suggerisci?
Rohan Kumar

13

JNDI è un'API utilizzata per accedere alla directory e ai servizi di denominazione (ovvero i mezzi con cui i nomi sono associati agli oggetti). L'associazione di un nome con un oggetto è chiamata associazione.

Un esempio di base di un servizio di denominazione è il DNS che mappa i nomi delle macchine su indirizzi IP.

Utilizzando JNDI, le applicazioni possono memorizzare e recuperare oggetti Java denominati di qualsiasi tipo.

Nel contesto di java questo può essere utilizzato nei file di configurazione in cui non si desidera codificare variabili specifiche dell'ambiente.

Esempio di primavera:

File di contesto di primavera

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

3

JNDI consente la semplificazione di un costrutto di risorsa in un semplice nome . Quindi, molti dettagli si raggruppano in 1 per comodità / sicurezza / ecc. (noto anche come livello di astrazione)

per realizzare: imposta un elenco di proprietà che corrisponde ai campi predefiniti nell'interfaccia contestuale di Jndi. (queste proprietà specificano le impostazioni per l'esecuzione jndi; ma * non il nome della ricerca)

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

idealmente, esisterebbe una funzione specializzata per mantenere una directory LDAP, DNS, ecc. nella tua organizzazione (quindi un unico set di mappatura unificato serve tutto, riducendo le discrepanze)

Elenco dei fornitori di servizi 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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.