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 =newInitialContext();
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 .
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.
@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.
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 =newProperties();//field Context.INITIAL_CONTEXT_FACTORY => property name java.naming.factory.initial//field Context.PROVIDER_URL => property name java.naming.provider.url
props.load(newFileInputStream("*properties file*"));//prop file in this caseContext ctx =newInitialContext(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)
Respuestas:
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":
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 .
fuente
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
XML
utilizar JavaBeansXMLEncoder
yXMLDecoder
: ¡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.
fuente
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
Archivo de contexto de Tomcat
fuente
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)
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
fuente