JNDI的目的是什么?

时间:2009-08-29 08:03:42

标签: java jndi

如果可能,您如何实现JNDI的使用?

4 个答案:

答案 0 :(得分:103)

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
}

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

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

答案 1 :(得分:29)

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

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

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

答案 2 :(得分:11)

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

命名服务的一个基本示例是DNS,它将计算机名称映射到IP地址。

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

在java的上下文中,这可以在您不想对环境特定变量进行硬编码的配置文件中使用。

Spring示例:

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

答案 3 :(得分:3)

JNDI允许将资源构造简化为名称。因此,为了方便/安全/等,将 group 的许多细节分为1。 (又名抽象层)

意识到: 设置与Jndi Context Interface中的预定义字段对应的属性列表。 (这些属性指定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