Qual é o propósito do JNDI

90

Como você pode perceber o uso do JNDI, com um exemplo se possível?

Ajay
fonte
3
Você pode verificar uma postagem de blog pessoal para casos de uso: tshikatshikaaa.blogspot.com/2013/01/…
Jérôme Verstrynge
@JVerstry +1 por apontar para um artigo que fala sobre LDAP, JCA e CCI relacionados.
Ajay
Confira este tópico do SO
Aniket Thakur

Respostas:

109

JNDI é o Java Naming and Directory Interface. É usado para separar as preocupações do desenvolvedor do aplicativo e do implantador do aplicativo . Ao escrever um aplicativo que depende de um banco de dados, você não precisa se preocupar com o nome de usuário ou a senha para se conectar a esse banco de dados. JNDI permite que o desenvolvedor dê um nome a um banco de dados e conte com o implementador para mapear esse nome para uma instância real do banco de dados.

Por exemplo, se você está escrevendo um código que é executado em um contêiner Java EE, pode escrever isso para obter a fonte de dados com o nome JNDI "Banco de dados":


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

Observe que não há nada aqui sobre o driver de banco de dados, o nome de usuário ou a senha. Isso é configurado dentro do contêiner.

JNDI não está restrito a bancos de dados (JDBC); todos os tipos de serviços podem receber nomes. Para mais detalhes, você deve conferir o tutorial do Oracle .

Simon Nickerson
fonte
10
Portanto, com este exemplo na imagem, como o JNDI difere de colocar nomes de banco de dados em um arquivo xml de configuração ou em um arquivo de propriedades e depois lê-lo a partir daí?
Ajay
11
Em primeiro lugar, você teria que armazenar a senha em texto simples em seu arquivo de configuração. Em segundo lugar, se você tiver vários aplicativos apontando para o mesmo banco de dados e algo sobre as mudanças de configuração do banco de dados, você deve atualizar a configuração em vários lugares.
Simon Nickerson
1
bem, como o JNDI ajuda aqui?
Ajay
1
isso deve conter tudo o que você precisa saber sobre JNDI, seja em um contexto J2EE ou em um contexto JavaSE. javaworld.com/javaworld/jw-04-2002/jw-0419-jndi.html
Nico
5
@SimonNickerson Hi !. Estou aprendendo sobre JNDI. Esta é uma boa resposta, mas se você notar a pergunta "Como você pode realizar o uso do JNDI?" então parece inacabado. Você descreveu a realização da perspectiva do desenvolvedor. E a perspectiva do implantador?
lxknvlk
30

JNDI é um mecanismo muito poderoso para organizar informações de configuração e descobrir e ouvir serviços usando o EventContext. No JNDI, você pode pesquisar e ouvir qualquer objeto (não apenas DataSources), supondo que seu provedor de serviços JNDI o suporte.

Claro, o único problema é realmente ter um provedor de serviços JNDI; a grande vantagem disso é que é surpreendentemente fácil de fazer o seu próprio. Afinal, você pode codificar qualquer instância Java para XMLusar JavaBeans XMLEncodere XMLDecoder: você não precisa depender da execução em um servidor de aplicativos!

Então, qual é a diferença entre isso e ter arquivos de configuração? Bem, pode ser muito mais limpo porque todos os seus aplicativos podem obter suas configurações do mesmo lugar . Se eles precisarem compartilhar informações de configuração (por exemplo, locais do banco de dados), isso pode ser definido uma vez no JNDI . Suponha que você tenha movido os servidores de banco de dados: você não precisa se lembrar dos zilhões de arquivos de configuração com a localização. Você apenas vai para um lugar: JNDI.

oxbow_lakes
fonte
Este é de longe o esclarecimento mais completo - Obrigado oxbow_lakes! Btw, você teria ponteiros de código onde qualquer instância Java foi codificada como você sugere?
Rohan Kumar
13

JNDI é uma API usada para acessar o diretório e os serviços de nomenclatura (ou seja, os meios pelos quais os nomes são associados aos objetos). A associação de um nome a um objeto é chamada de vinculação.

Um exemplo básico de serviço de nomenclatura é o DNS, que mapeia nomes de máquinas para endereços IP.

Usando JNDI, os aplicativos podem armazenar e recuperar objetos Java nomeados de qualquer tipo.

No contexto do java, isso pode ser usado em arquivos de configuração onde você não deseja codificar variáveis ​​específicas do ambiente.

Exemplo de primavera:

Arquivo 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>

Arquivo 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"/>
Ithar
fonte
3

JNDI permite a simplificação de uma construção de recurso em apenas um nome . Portanto, são muitos detalhes agrupados em 1 por conveniência / segurança / etc. (também conhecido como camada de abstração)

para realizar: configure uma lista de propriedades que corresponda aos campos predefinidos na interface de contexto Jndi. (essas propriedades especificam as configurações para a execução jndi; mas * não o nome da pesquisa)

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, uma função especializada existiria para manter um diretório LDAP, DNS, etc, em sua organização (de forma que um único conjunto de mapeamento unificado atenda a todos, reduzindo as discrepâncias)

Lista de Provedores de Serviços 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

ilupper
fonte