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 =newInitialContext();
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 .
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.
@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.
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.
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 =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, 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)
Respostas:
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":
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 .
fonte
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 apenasDataSource
s), 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
XML
usar JavaBeansXMLEncoder
eXMLDecoder
: 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.
fonte
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
Arquivo de contexto Tomcat
fonte
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)
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
fonte