Cuál es el propósito de JNDI


Respuestas:


109

JNDI es la interfaz de directorio y nombres de Java. Se utiliza para separar las preocupaciones del desarrollador de la aplicación y del implementador de la aplicación . Cuando escribe una aplicación que se basa en una base de datos, no debe preocuparse por el nombre de usuario o la contraseña para conectarse a esa base de datos. JNDI permite al desarrollador dar un nombre a una base de datos y confiar en que el implementador mapee ese nombre a una instancia real de la base de datos.

Por ejemplo, si está escribiendo código que se ejecuta en un contenedor Java EE, puede escribir esto para obtener la fuente de datos con el nombre JNDI "Base de datos":


DataSource dataSource = null;
try
{
    Context context = new InitialContext();
    dataSource = (DataSource) context.lookup("Database");
}
catch (NamingException e)
{
    // Couldn't find the data source: give up
}

Tenga en cuenta que aquí no hay nada sobre el controlador de la base de datos, el nombre de usuario o la contraseña. Que se configura dentro del contenedor.

JNDI no está restringido a bases de datos (JDBC); todo tipo de servicios pueden recibir nombres. Para obtener más detalles, debe consultar el tutorial de Oracle .


10
Entonces, con este ejemplo en la imagen, ¿en qué se diferencia JNDI de colocar los nombres de la base de datos en un archivo xml de configuración o en un archivo de propiedades y luego leerlo desde allí?
Ajay

11
En primer lugar, tendría que almacenar la contraseña en texto sin formato en su archivo de configuración. En segundo lugar, si tiene varias aplicaciones que apuntan a la misma base de datos y algo acerca de los cambios de configuración de la base de datos, debe actualizar la configuración en varios lugares.
Simon Nickerson

1
bueno, ¿cómo ayuda JNDI aquí?
Ajay

1
esto debería contener todo lo que necesita saber sobre JNDI, ya sea en un contexto J2EE o en un contexto JavaSE. javaworld.com/javaworld/jw-04-2002/jw-0419-jndi.html
Nico

5
@SimonNickerson ¡Hola !. Estoy aprendiendo sobre JNDI. Esta es una buena respuesta, pero si observa la pregunta "¿Cómo puede darse cuenta del uso de JNDI?" entonces parece inacabado. Describiste la realización desde la perspectiva del desarrollador. ¿Qué tal la perspectiva del desplegador?
lxknvlk

30

JNDI es un mecanismo muy poderoso tanto para organizar la información de configuración como para descubrir y escuchar servicios mediante el uso de EventContext. En JNDI puede buscar y escuchar cualquier objeto (no soloDataSource s), asumiendo que su proveedor de servicios JNDI lo admite.

Por supuesto, el único problema es tener un proveedor de servicios JNDI; Lo mejor de esto es que es sorprendentemente fácil hacer el tuyo. Después de todo, puede codificar cualquier instancia de Java para XMLutilizar JavaBeans XMLEncoderyXMLDecoder : ¡no necesita depender de la ejecución dentro de un servidor de aplicaciones!

Entonces, ¿cuál es la diferencia entre esto y tener archivos de configuración? Bueno, puede ser mucho más limpio porque todas sus aplicaciones pueden obtener su configuración desde el mismo lugar . Si necesitan compartir información de configuración (por ejemplo, ubicaciones de bases de datos), esto se puede definir una vez en JNDI . Suponga que movió los servidores de la base de datos: no necesita recordar los miles de millones de archivos de configuración con la ubicación. Solo tienes que ir al único lugar: JNDI.


Esta es, con mucho, la aclaración más completa: ¡Gracias oxbow_lakes! Por cierto, ¿tendrías punteros de código donde se haya codificado alguna instancia de Java como sugieres?
Rohan Kumar

13

JNDI es una API que se utiliza para acceder al directorio y a los servicios de nombres (es decir, los medios por los que los nombres se asocian con los objetos). La asociación de un nombre con un objeto se llama enlace.

Un ejemplo básico de un servicio de nombres es el DNS, que asigna nombres de máquinas a direcciones IP.

Con JNDI, las aplicaciones pueden almacenar y recuperar objetos Java con nombre de cualquier tipo.

Dentro del contexto de Java, esto se puede usar en archivos de configuración donde no desea codificar variables específicas del entorno.

Ejemplo de primavera:

Archivo de contexto de 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>

Archivo de contexto de 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 permite la simplificación de una construcción de recursos en solo un nombre . Por lo tanto, muchos detalles se agrupan en 1 por conveniencia / seguridad / etc. (también conocido como capa de abstracción)

para darse cuenta: configure una lista de propiedades que corresponda a los campos predefinidos en la interfaz de contexto Jndi. (estas propiedades especifican la configuración para la ejecución de jndi; pero * no el nombre de búsqueda)

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, existiría una función especializada para mantener un directorio LDAP, DNS, etc., en su organización (por lo que un conjunto de mapeo único unificado da servicio a todo, reduciendo las discrepancias)

Lista de proveedores de servicios 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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.