ejemplo java jndi

java - ejemplo - jndi weblogic



¿Cuál es el propósito de JNDI? (4)

JNDI es la interfaz de nombres y directorios de Java. Se usa para separar las preocupaciones del desarrollador de la aplicación y del implementador de la aplicación. Cuando está escribiendo una aplicación que se basa en una base de datos, no debería tener que preocuparse por el nombre de usuario o la contraseña para conectarse a esa base de datos. JNDI le permite al desarrollador dar un nombre a una base de datos y confiar en que el implementador asigne 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. Eso está configurado 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 Sun sobre el tema.

¿Cómo puede darse cuenta del uso de JNDI, con un ejemplo si es posible?


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

Por supuesto, el único problema es tener un proveedor de servicios JNDI; Lo bueno de esto es que es sorprendentemente fácil de hacer tu propio. Después de todo, puede codificar cualquier instancia de Java en XML utilizando JavaBeans XMLEncoder y XMLDecoder : ¡no necesita confiar en ejecutar 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 . Supongamos que mueve los servidores de bases de datos: no necesita recordar los archivos de configuración de gazillion con la ubicación en él. Simplemente ve al único lugar: JNDI.


JNDI es una API utilizada para acceder al directorio y a los servicios de denominación (es decir, los medios por los cuales los nombres están asociados a los objetos). La asociación de un nombre con un objeto se llama enlace.

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

Usando JNDI, las aplicaciones pueden almacenar y recuperar objetos Java nombrados de cualquier tipo.

Dentro del contexto de Java, esto se puede usar en archivos de configuración donde no se desea codificar las 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 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 permite la simplificación de una construcción de recursos en solo un nombre . Por lo tanto, hay muchos detalles del grupo en 1 para conveniencia / seguridad / etc. (también conocida como capa de abstracción)

para realizar: configure una lista de propiedades que corresponda a los campos predefinidos en la interfaz de contexto de 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 solo conjunto de mapas unificado sirve a todos, 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