Como você pode perceber o uso do JNDI, com um exemplo se possível?
Como você pode perceber o uso do JNDI, com um exemplo se possível?
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":
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 .
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 DataSource
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 JavaBeans XMLEncoder
e 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.
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"/>
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