Come puoi realizzare l'utilizzo di JNDI, con un esempio se possibile?
Come puoi realizzare l'utilizzo di JNDI, con un esempio se possibile?
Risposte:
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 .
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 DataSource
i), 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 XML
utilizzando i JavaBeans XMLEncoder
e 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.
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"/>
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