JNDI的目的是什么?

Aja*_*jay 87 java jndi

如果可能的话,如何通过一个例子来实现JNDI的使用?

Sim*_*son 107

JNDI是Java命名和目录接口.它用于分离应用程序开发人员和应用程序部署者的顾虑.当您编写依赖于数据库的应用程序时,您不必担心用于连接到该数据库的用户名或密码.JNDI允许开发人员为数据库命名,并依赖部署者将该名称映射到数据库的实际实例.

例如,如果您正在编写在Java EE容器中运行的代码,则可以编写此代码来获取JNDI名称为"Database"的数据源:


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

请注意,这里没有关于数据库驱动程序,用户名或密码的信息.这是在容器内配置的.

JNDI不限于数据库(JDBC); 各种服务都可以命名.有关更多详细信息,请查看有关该主题的Sun教程.

  • 首先,您必须在配置文件中以纯文本格式存储密码.其次,如果您有多个指向同一数据库的应用程序以及有关数据库配置更改的内容,则必须在多个位置更新配置. (11认同)
  • 因此,使用图中的这个示例,JNDI与将数据库名称放在config xml文件或属性文件中然后从那里读取它有何不同? (10认同)
  • @SimonNickerson嗨!我正在学习JNDI.这是一个很好的答案,但如果您注意到"您如何实现JNDI的使用?"的问题.然后它看起来未完成.您从开发人员的角度描述了实现.部署者的观点如何? (4认同)

oxb*_*kes 29

JNDI是一个非常强大的机制,用于组织配置信息以及通过使用它来发现和收听服务EventContext.在JNDI中,您可以查找并侦听任何对象(而不仅仅是DataSources),假设您的JNDI服务提供程序支持它.

当然,唯一的问题是实际上有一个JNDI服务提供商; 关于这一点的好处是它很容易推出自己的.毕竟,你可以编码任何Java实例XML使用的JavaBeans XMLEncoderXMLDecoder:你不需要依赖于应用程序服务器中运行!

那么这个配置文件有什么区别?嗯,它可以更清洁,因为您的所有应用程序都可以从同一个地方获取其配置.如果他们需要共享配置信息(例如数据库位置),那么可以在JNDI中定义一次.假设您移动了数据库服务器:您不需要记住包含位置的gazillion配置文件.你只是去一个地方:JNDI.


Ith*_*har 11

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>
Run Code Online (Sandbox Code Playgroud)

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"/>
Run Code Online (Sandbox Code Playgroud)