什么是JNDI的目的(What is the purpose of JNDI)

2019-07-04 00:57发布

你怎么能实现JNDI的使用,与可能的话一个例子吗?

Answer 1:

JNDI是Java命名和目录接口。 它是用于分离应用程序和应用程序的关注。 当你写这依赖于一个数据库上的应用程序,你应该不需要担心用于连接到数据库的用户名或密码。 JNDI允许开发者提供一个名称数据库,并依靠部署到该名称映射到数据库中的实际例子。

例如,如果你正在写在一个Java EE容器中运行的代码,你可以写这个得到一个JNDI名为“数据库”的数据源的保持:


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

注意:没有什么对这里的数据库驱动程序,或用户名或密码。 其被配置在容器内部。

JNDI并不限于数据库(JDBC); 服务的各种可赐名。 有关详细信息,你应该看看太阳教程的主题。



Answer 2:

JNDI是两个组织的配置信息和发现,并通过使用监听服务非常强大的机制EventContext 。 在JNDI,你可以查找和收听到任何对象(而不仅仅是DataSource S),假设你的JNDI服务提供商支持它。

当然,唯一的问题实际上有JNDI服务提供商; 关于这个伟大的事情是,它非常容易滚你自己。 毕竟,你可以在任何Java实例编码为XML使用的JavaBeans XMLEncoderXMLDecoder :你不需要依赖于应用程序服务器中运行!

那么,这是什么一个具有配置文件之间的差异? 那么,它可能是更清洁,因为所有的应用程序都可以从同一个地方得到他们的配置。 如果他们需要共享配置信息(例如数据库的位置),那么这可以一次JNDI来定义 。 假设你移动的数据库服务器:你不需要记住,在它的位置极大数的配置文件。 你刚才去的一个地方:JNDI。



Answer 3:

JNDI是用于访问目录和命名服务(即通过名称与对象相关联的方式)的API。 一个名字与对象的关联称为绑定。

命名服务的一个基本的例子是DNS哪台机器名称映射到IP地址。

使用JNDI,应用程序可以存储和检索任何类型的命名Java对象。

在Java的背景下,这个可以在配置文件中,你不想硬编码的环境特定的变量中。

春天例子:

Spring上下文文件

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

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"/>


Answer 4:

JNDI允许资源的简化构造成只是一个名字 。 因此,它的许多细节到1为了方便/安全/等。 (又名抽象层)

认识到:设置对应于在JNDI上下文接口的预定义字段一个属性列表。 (这些属性指定的JNDI执行的设置,但*不搜索名称)

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*");

理想情况下,一个专门的功能将存在保持LDAP目录,DNS等,在您的组织(这样一个统一的单一映射集合所有的服务,减少差异)

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



文章来源: What is the purpose of JNDI
标签: java jndi