O que é o JNDI? Qual é o seu uso básico? Quando é usado?

284
  • O que é o JNDI ?

  • Qual é o seu uso básico?

  • Quando é usado?

LetsSyncUp
fonte
1
Consulte a postagem do blog pessoal para obter definição e casos de uso: tshikatshikaaa.blogspot.com/2013/01/…
Jérôme Verstrynge

Respostas:

241

O que é o JNDI?

Significa nomeação de Java e interface de diretório .

Qual é o seu uso básico?

O JNDI permite que aplicativos distribuídos procurem serviços de uma maneira abstrata e independente de recursos.

Quando é usado?

O caso de uso mais comum é configurar um conjunto de conexões com o banco de dados em um servidor de aplicativos Java EE. Qualquer aplicativo implementado nesse servidor pode obter acesso às conexões necessárias usando o nome JNDI java:comp/env/FooBarPoolsem precisar conhecer os detalhes sobre a conexão.

Isso tem várias vantagens:

  1. Se você tiver uma sequência de implementação em que os aplicativos sejam movidos de devl->int->test->prodambientes, poderá usar o mesmo nome JNDI em cada ambiente e ocultar o banco de dados real que está sendo usado. Os aplicativos não precisam mudar à medida que migram entre ambientes.
  2. Você pode minimizar o número de pessoas que precisam conhecer as credenciais para acessar um banco de dados de produção. Somente o servidor de aplicativos Java EE precisa saber se você usa JNDI.
duffymo
fonte
9
então essa é basicamente uma alternativa mais segura para ter um arquivo de propriedades com suas informações de conexão jdbc?
Grinch
4
@ Grinch: Essencialmente sim. É mais seguro e padronizado, facilitando a implantação (não é necessário adivinhar qual deve ser o nome do arquivo de propriedades etc.).
sleske
Qual é a diferença entre o uso de variáveis ​​de ambiente e o JNDI? É um conceito semelhante?
skryvets 18/09/19
100

O que é o JNDI?

A Java Naming and Directory Interface TM (JNDI) é uma interface de programação de aplicativos (API) que fornece funcionalidade de nomeação e diretório para aplicativos gravados usando a linguagem de programação Java TM . Ele é definido como independente de qualquer implementação de serviço de diretório específica. Assim, uma variedade de diretórios (novos, emergentes e já implantados) pode ser acessada de maneira comum.

Qual é o seu uso básico?

A maior parte é abordada na resposta acima, mas eu gostaria de fornecer arquitetura aqui para que acima faça mais sentido.

insira a descrição da imagem aqui

Para usar o JNDI, você deve ter as classes JNDI e um ou mais provedores de serviços. O Java 2 SDK, v1.3 inclui três provedores de serviços para os seguintes serviços de nomenclatura / diretório:

  1. LDAP (Lightweight Directory Access Protocol)
  2. Serviço de nome do Common Object Request Broker Architecture (CORBA)
  3. Registro RMI (Java Remote Method Invocation)

Então, basicamente, você cria objetos e os registra nos serviços de diretório, nos quais você pode posteriormente procurar e executar operações.

Aniket Thakur
fonte
30

JNDI em termos leigos é basicamente uma interface para poder obter instâncias de recursos internos / externos, como

  javax.sql.DataSource, 
  javax.jms.Connection-Factory,
  javax.jms.QueueConnectionFactory,
  javax.jms.TopicConnectionFactory,
  javax.mail.Session, java.net.URL,
  javax.resource.cci.ConnectionFactory,

ou qualquer outro tipo definido por um adaptador de recursos JCA. Ele fornece uma sintaxe para poder criar acesso interno ou externo. ie (comp / env neste caso significa onde o componente / ambiente, existem muitas outras sintaxes):

jndiContext.lookup("java:comp/env/persistence/customerDB");
mel3kings
fonte
1
Isso é apenas parte da imagem. O JNDI permite procurar objetos Java - eles podem ser recursos como um DataSource ou qualquer outra coisa, até simples java.lang.Stringpara obter informações de configuração.
sleske
3
@sleske, sugiro que você faça sua própria resposta então.
Ced
14

Visão geral da JNDI

JNDI é uma API especificada na tecnologia Java que fornece funcionalidade de nomenclatura e diretório para aplicativos gravados na linguagem de programação Java. Ele foi projetado especialmente para a plataforma Java usando o modelo de objeto do Java. Usando JNDI, aplicativos baseados na tecnologia Java podem armazenar e recuperar objetos Java nomeados de qualquer tipo. Além disso, o JNDI fornece métodos para executar operações de diretório padrão, como associar atributos a objetos e procurar objetos usando seus atributos.

A JNDI também é definida independentemente de qualquer implementação específica de serviço de nomes ou diretório. Ele permite que os aplicativos acessem serviços de nomes e diretórios diferentes, possivelmente múltiplos, usando uma API comum. Diferentes fornecedores de serviços de nomes e diretórios podem ser conectados perfeitamente por trás dessa API comum. Isso permite que aplicativos baseados na tecnologia Java aproveitem as informações em uma variedade de serviços de nomes e diretórios existentes, como LDAP, NDS, DNS e NIS (YP), além de permitir que os aplicativos coexistam com sistemas e softwares herdados.

Usando o JNDI como ferramenta, é possível criar novos aplicativos portáteis e poderosos que não apenas tiram proveito do modelo de objeto do Java, mas também estão bem integrados ao ambiente em que são implementados.

Referência

Chathuranga Chandrasekara
fonte
9

O que é o JNDI?

JNDI significa Java Naming and Directory Interface. Ele vem de fábrica com o J2EE.

Qual é o seu uso básico?

Com esta API, você pode acessar muitos tipos de dados, como objetos, dispositivos, arquivos de nomes e serviços de diretório, por exemplo. é usado pelo EJB para encontrar objetos remotos. O JNDI foi projetado para fornecer uma interface comum para acessar serviços existentes, como DNS, NDS, LDAP, CORBA e RMI.

Quando é usado?

Você pode usar o JNDI para executar operações de nomenclatura, incluindo operações de leitura e operações para atualizar o espaço para nome. As seguintes operações são descritas aqui .

Sabin Chirila
fonte
7

Um serviço de nomenclatura associa nomes a objetos e localiza objetos com base em seus nomes. (O registro RMI é um bom exemplo de serviço de nomenclatura.) O JNDI fornece uma interface comum para muitos serviços de nomenclatura existentes, como LDAP, DNS.

Sem o JNDI, o local ou as informações de acesso dos recursos remotos teriam que ser codificados em aplicativos ou disponibilizados em uma configuração. Manter essas informações é bastante tediosa e propensa a erros.

Chetan Laddha
fonte
3

Só estou curioso para saber por que os documentos oficiais são tão ignorados que já elaboram os detalhes meticulosamente.

Mas se você quiser entender os casos, consulte a resposta da duffymo .

A Java Naming and Directory Interface TM (JNDI) é uma interface de programação de aplicativos (API) que fornece funcionalidade de nomeação e diretório para aplicativos gravados usando a linguagem de programação Java TM . Ele é definido como independente de qualquer implementação de serviço de diretório específica. Assim, uma variedade de diretórios - novos, emergentes e já implantados - pode ser acessada de maneira comum.

E sua arquitetura

insira a descrição da imagem aqui

E normalmente como você o usa .

Hearen
fonte
5
I am just curious why the official docs are so ignored which elaborate the details meticulously alreadyTalvez porque não expliquem de maneira suficiente que as pessoas comuns possam entender?
skryvets 18/09/19
1

Usarei um exemplo para explicar como o JNDI pode ser usado para configurar o banco de dados sem que nenhum desenvolvedor de aplicativos saiba o nome de usuário e a senha do banco de dados.

1) Configuramos a fonte de dados no standalone-full.xml do servidor JBoss . Além disso, também podemos configurar os detalhes do pool.

 <datasource jta="false" jndi-name="java:/DEV.DS" pool-name="DEV" enabled="true" use-ccm="false">
                <connection-url>jdbc:oracle:thin:@<IP>:1521:DEV</connection-url>
                <driver-class>oracle.jdbc.OracleDriver</driver-class>
                <driver>oracle</driver>
                <security>
                    <user-name>usname</user-name>
                    <password>pass</password>
                    </security>
                    <security>

 <security-domain>encryptedSecurityDomain</security-domain>
                    </security>

                <validation>
                    <validate-on-match>false</validate-on-match>
                    <background-validation>false</background-validation>
                    <background-validation-millis>1</background-validation-millis>
                </validation>
                <statement>
                    <prepared-statement-cache-size>0</prepared-statement-cache-size>
                    <share-prepared-statements>false</share-prepared-statements>
                    <pool>
                        <min-pool-size>5</min-pool-size>
                        <max-pool-size>10</max-pool-size>
                    </pool>
                </statement>
            </datasource>

insira a descrição da imagem aqui

Agora, esse jndi-name e seu objeto associado de fonte de dados estarão disponíveis para nosso application.application.

2) Podemos recuperar esse objeto de fonte de dados usando a classe JndiDataSourceLookup.

insira a descrição da imagem aqui

O Spring instancia o bean da fonte de dados, depois de fornecermos o nome jndi.

Agora, podemos alterar o tamanho do pool, nome de usuário ou senha de acordo com nosso ambiente ou requisito, mas isso não afetará o aplicativo.

Nota : encryptedSecurityDomain, precisamos configurá-lo separadamente no servidor JBoss, como

<security-domain name="encryptedSecurityDomain" cache-type="default">
                    <authentication>
                        <login-module code="org.picketbox.datasource.security.SecureIdentityLoginModule" flag="required">
                            <module-option name="username" value="<usernamefordb>"/>
                            <module-option name="password" value="894c8a6aegc8d028ce169c596d67afd0"/>
                        </login-module>
                    </authentication>
                </security-domain>

Este é um dos casos de uso. Espero que isso esclareça.

Yogesh Sanchihar
fonte
0

A melhor explicação para mim é dada aqui

O que é JNDI

É uma API para fornecer acesso a um serviço de diretório, ou seja, um nome de mapeamento de serviço (strings) com objetos, referência a objetos remotos ou dados simples . Isso é chamado de ligação. O conjunto de ligações é chamado de contexto . Os aplicativos usam a interface JNDI para acessar recursos.

Para simplificar, é como um mapa de hash com uma chave String e valores de Objeto que representam recursos na web.

Quais problemas o JNDI resolve

Sem o JNDI, o local ou as informações de acesso dos recursos remotos teriam que ser codificados em aplicativos ou disponibilizados em uma configuração. Manter essas informações é bastante tediosa e propensa a erros.

Se um recurso foi realocado em outro servidor, com outro endereço IP, por exemplo, todos os aplicativos que usam esse recurso precisariam ser atualizados com essas novas informações. Com o JNDI, isso não é necessário. Somente a ligação de recurso correspondente deve ser atualizada. Os aplicativos ainda podem acessá-lo com seu nome e a realocação é transparente.

xagaffar
fonte