JNDI
A JNDI ou Java Naming and Directory Interface é uma API para acesso a serviços de diretórios. Ela permite que aplicações cliente descubram e obtenham dados ou objetos através de um nome. Assim como todas as APIs Java, ela é independente de plataforma. Adicionalmente, ela especifica uma interface de serviço (SPI), que permite que softwares de serviço de diretório suportem o seu framework. A solução de diretório pode ser baseada em rede, arquivos ou base de dados, sendo apenas uma questão de escolha do fornecedor do produto.
A API JNDI é utilizada em aplicações Java que acessam recursos externos, como base de dados, filas ou tópicos JMS e componentes JavaEE. Os administradores do sistema gravam objetos administrados num serviço de diretório disponibilizado pelo servidor de aplicações (normalmente); a aplicação busca estes objetos através da JNDI (lookup). A API disponibiliza:
- um mecanismo para ligar um objeto a um nome;
- uma interface padronizada de busca de objetos no serviço de diretório;
- uma interface de eventos que permite que um usuário saiba quando uma entrada (nome + objeto) foi modificada;
- extensões que suportam as capacidades do padrão LDAP.
A SPI permite que a JNDI suporte praticamente qualquer tipo de serviço de diretório incluindo:
A especificação JNDI foi lançada em 10 de março de 1997 pela Sun Microsystems. A versão atual da JNDI é 1.2.
Lookup básico
[editar | editar código-fonte]A JNDI organiza os nomes em uma hierarquia. Um nome pode ser qualquer string, como "org.mydomain.ejb.MyBean". Um nome também pode ser um objeto que suporte a interface Name
, porém os objetos são normalmente nomeados através de strings. Cada nome na hierarquia JNDI corresponde a um objeto (ou uma referência deste objeto) gravado no serviço de diretório.
A JNDI define um contexto que especifica onde procurar pelo objeto. O contexto inicial é tipicamente utilizado como ponto de partida.
O contexto inicial é análogo a raiz, ou topo, de uma árvore de diretórios ou sistema de arquivos. Um exemplo de criação de um contexto inicial num trecho de programa em Java:
Hashtable args = new Hashtable();
//Inicialmente e necessario definir a classe ''factory'' do contexto
args.put( Context.INITIAL_CONTEXT_FACTORY, "com.jndiprovider.TheirContextFactory");
//O próximo argumento é a URL definindo a localização do objeto:
args.put( Context.PROVIDER_URL, "http://jndiprovider-database");
//Finalmente é criado o contexto inicial
Context myCurrentContext = new InitialContext( args );
Através do objeto de contexto (Context) é realizada a busca (lookup) pelo objeto de nome org.mydomain.ejb.MyBean. Um exemplo:
Object obj = myCurrentContext.lookup( "org.mydomain.ejb.MyBean" );
//este passo e necessario para EJBs.
MyBean myBean = (MyBean) PortableRemoteObject.narrow( reference, MyBean.class );
Buscando
[editar | editar código-fonte]Os diretórios são uma espécie de contexto, eles restringem o espaço da busca (namespace) da mesma maneira que faz uma estrutura de diretórios de um sistema de arquivos.