2009-08-29 24 views
70

¿Cómo puede darse cuenta del uso de JNDI, con un ejemplo si es posible?¿Cuál es el propósito de JNDI

+3

Puede comprobar un blog personal para casos de uso: http : // tshikatshikaaa.blogspot.com/2013/01/what-is-jndi-spi-cci-ldap-and-jca.html – JVerstry

+0

@JVerstry +1 para señalar un artículo que habla sobre LDAP, JCA y CCI relacionados. – Ajay

+0

Consulte [este subproceso SO] (http://stackoverflow.com/a/21227726/2396539) –

Respuesta

90

JNDI es la Interfaz de nombres y directorios de Java. Se utiliza para separar las preocupaciones de la aplicación desarrollador y la aplicación deployer. 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 usted está escribiendo código que se ejecuta en un contenedor Java EE, puede escribir esto para controlar la fuente de datos con JNDI nombre de "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 
} 

Nota aquí no hay nada sobre el controlador de la base de datos, o el nombre de usuario, o la contraseña. Eso está configurado dentro del contenedor.

JNDI no está restringido a las bases de datos (JDBC); todo tipo de servicios pueden recibir nombres. Para obtener más información, debe consultar el Sun tutorial sobre el tema.

+9

Entonces, con este ejemplo en la imagen, ¿cómo es JNDI diferente de colocar los nombres de las bases de datos en un archivo config xml o un archivo de propiedades y luego leyéndolo desde allí? – Ajay

+9

En primer lugar, debe 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 sobre los cambios de configuración de la base de datos, debe actualizar la configuración en varios lugares. –

+0

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

26

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

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 los JavaBeans XMLEncoder y XMLDecoder: ¡no necesita confiar en que se ejecuta dentro de un servidor de aplicaciones!

¿Cuál es la diferencia entre tener archivos de configuración? Bueno, puede ser mucho más limpio porque todas sus aplicaciones pueden obtener su configuración de en el mismo lugar. Si necesitan compartir información de configuración (por ejemplo, ubicaciones de bases de datos), entonces 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.

3

JNDI permite la simplificación de una construcción de recursos en solo un nombre . Por lo tanto, es muchos detalles grupo en 1 para la conveniencia/seguridad/etc. (También conocido como capa de abstracción)

para darse cuenta: configurar una lista de propiedades que se corresponde con los campos predefinidos en el contexto JNDI interfaz.(Estas propiedades especifican los parámetros para la ejecución 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 unificado establecidas servicios de mapas todos, discrepancias reductores)

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

9

JNDI es un API utilizado para acceder al directorio y los servicios de nombres (es decir, los medios por los que los nombres se asocian con 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 los nombres de las máquinas a las direcciones IP.

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

En el contexto de java esto se puede utilizar en archivos de configuración donde no desea codificar las variables específicas del entorno.

primavera Ejemplo:

archivo de contexto 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"/> 
Cuestiones relacionadas