什么是 JNDI?它的基本用途是什么?什么时候使用?

Posted

技术标签:

【中文标题】什么是 JNDI?它的基本用途是什么?什么时候使用?【英文标题】:What is JNDI? What is its basic use? When is it used? 【发布时间】:2011-05-20 22:04:35 【问题描述】:

什么是JNDI

它的基本用途是什么?

什么时候使用?

【问题讨论】:

定义和用例见个人博文:tshikatshikaaa.blogspot.com/2013/01/… 2021 年 12 月签到...你不想知道我们对 JNDI 的看法 :) 【参考方案1】:

JNDI 概述

JNDI 是 Java 中指定的 API 提供命名和 目录功能 用 Java 编写的应用程序 编程语言。它被设计 特别是对于 Java 平台使用 Java的对象模型。使用 JNDI, 基于Java技术的应用程序 可以存储和检索命名的Java 任何类型的对象。此外,JNDI 提供执行方法 标准目录操作,例如 将属性与对象关联 并使用他们的搜索对象 属性。

JNDI 的定义也独立于 任何特定的命名或目录 服务实施。它使 访问不同的应用程序, 可能是多个,命名和 使用通用 API 的目录服务。 不同的命名和目录服务 提供者可以无缝插入 在这个通用 API 的背后。这使 基于 Java 技术的应用程序 充分利用信息 各种现有的命名和 目录服务,例如 LDAP、NDS、 DNS 和 NIS(YP),以及启用 共存的应用程序 遗留软件和系统。

使用 JNDI 作为工具,您可以构建 新的强大和便携的应用程序 不仅可以利用 Java 的 对象模型,但也是 与环境融为一体 部署它们的位置。

Reference

【讨论】:

【参考方案2】:

什么是 JNDI?

它代表Java Naming and Directory Interface。

它的基本用途是什么?

JNDI 允许分布式应用程序以一种抽象的、与资源无关的方式查找服务。

什么时候用?

最常见的用例是在 Java EE 应用服务器上设置数据库连接池。部署在该服务器上的任何应用程序都可以使用 JNDI 名称 java:comp/env/FooBarPool 访问所需的连接,而无需了解有关连接的详细信息。

这有几个优点:

    如果您有一个应用程序从devl->int->test->prod 环境移动的部署顺序,您可以在每个环境中使用相同的 JNDI 名称并隐藏正在使用的实际数据库。应用程序在环境之间迁移时不必更改。 您可以最大限度地减少需要知道用于访问生产数据库的凭据的人员数量。只有 Java EE 应用服务器需要知道您是否使用 JNDI。

【讨论】:

所以这基本上是一个更安全的替代方案,而不是使用带有 jdbc 连接信息的属性文件? @grinch:基本上是的。它更安全,更标准化,从而使部署更容易(无需猜测属性文件的名称等)。 那么使用环境变量和JNDI有什么区别呢?是不是类似的概念?【参考方案3】:

通俗地说,JNDI 基本上是一个接口,用于获取内部/外部资源的实例,例如

  javax.sql.DataSource, 
  javax.jms.Connection-Factory,
  javax.jms.QueueConnectionFactory,
  javax.jms.TopicConnectionFactory,
  javax.mail.Session, java.net.URL,
  javax.resource.cci.ConnectionFactory,

或由 JCA 资源适配器定义的任何其他类型。 它提供了一种能够创建访问的语法,无论它们是内部的还是外部的。即(在这种情况下,comp/env 表示组件/环境,还有很多其他语法):

jndiContext.lookup("java:comp/env/persistence/customerDB");

【讨论】:

这只是图片的一部分。 JNDI 让您可以查找 Java 对象 - 它们可以是 DataSource 之类的资源,或者其他东西,甚至是普通的 java.lang.String 以获取配置信息。【参考方案4】:

什么是 JNDI?

JNDI 代表 Java 命名和目录接口。它是 J2EE 的标准配置。

它的基本用途是什么?

使用此 API,您可以访问多种类型的数据,例如对象、设备、命名文件和目录服务,例如。 EJB 使用它来查找远程对象。 JNDI 旨在提供一个通用接口来访问现有服务,如 DNS、NDS、LDAP、CORBA 和 RMI。

什么时候使用?

您可以使用 JNDI 执行命名操作,包括读取操作和更新命名空间的操作。以下操作描述here。

【讨论】:

【参考方案5】:

什么是 JNDI?

Java 命名和目录接口TM (JNDI) 是一种应用程序编程接口 (API),它为使用 JavaTM 编程语言编写的应用程序提供命名和目录功能.它被定义为独立于任何特定的目录服务实现。因此,可以以通用方式访问各种目录(新的、新兴的和已部署的)。

它的基本用途是什么?

上面的答案中涵盖了大部分内容,但我想在这里提供架构,以便上面更有意义。

要使用 JNDI,您必须拥有 JNDI 类和一个或多个服务提供者。 Java 2 SDK,v1.3 包括三个服务提供者,用于以下命名/目录服务:

    轻量级目录访问协议 (LDAP) 通用对象请求代理架构 (CORBA) 通用对象服务 (COS) 名称服务 Java 远程方法调用 (RMI) 注册表

所以基本上你创建对象并将它们注册到目录服务上,你以后可以对其进行查找和执行操作。

【讨论】:

【参考方案6】:

命名服务将名称与对象相关联,并根据给定的名称查找对象。(RMI 注册表是命名服务的一个很好的例子。)JNDI 为许多现有的命名服务提供了一个通用接口,例如 LDAP、DNS。

如果没有 JNDI,远程资源的位置或访问信息必须在应用程序中硬编码或在配置中可用。维护这些信息非常繁琐且容易出错。

【讨论】:

【参考方案7】:

我只是好奇为什么official docs 被如此忽视,它已经细致地阐述了细节。

但如果您想了解案例,请参考duffymo's answer

Java 命名和目录接口TM (JNDI) 是一种应用程序编程接口 (API),它为使用 JavaTM 编程语言编写的应用程序提供命名和目录功能.它被定义为独立于任何特定的目录服务实现。因此,各种目录——新的、新兴的和已经部署的——都可以以一种通用的方式访问。

及其架构

通常是how you use it。

【讨论】:

I am just curious why the official docs are so ignored which elaborate the details meticulously already 也许是因为他们没有以普通人能够理解的充分方式解释? 对以上评论的投票多于此答案。 @Hearen - 我想你知道为什么官方文档没用了【参考方案8】:

我将使用一个示例来解释如何使用 JNDI 来配置数据库,而无需任何应用程序开发人员知道数据库的用户名和密码。

1) 我们已经在 J​​Boss 服务器的 standalone-full.xml 中配置了数据源。此外,我们还可以配置池详细信息。

 <datasource jta="false" jndi-name="java:/DEV.DS" pool-name="DEV" enabled="true" use-ccm="false">
                <connection-url>jdbc:oracle:thin:@<IP>:1521:DEV</connection-url>
                <driver-class>oracle.jdbc.OracleDriver</driver-class>
                <driver>oracle</driver>
                <security>
                    <user-name>usname</user-name>
                    <password>pass</password>
                    </security>
                    <security>

 <security-domain>encryptedSecurityDomain</security-domain>
                    </security>

                <validation>
                    <validate-on-match>false</validate-on-match>
                    <background-validation>false</background-validation>
                    <background-validation-millis>1</background-validation-millis>
                </validation>
                <statement>
                    <prepared-statement-cache-size>0</prepared-statement-cache-size>
                    <share-prepared-statements>false</share-prepared-statements>
                    <pool>
                        <min-pool-size>5</min-pool-size>
                        <max-pool-size>10</max-pool-size>
                    </pool>
                </statement>
            </datasource>

现在,这个 jndi-name 及其关联的数据源对象将可用于我们的 application.application。

2) 我们可以使用 JndiDataSourceLookup 类检索这个数据源对象。

在我们提供 jndi-name 之后,Spring 将实例化数据源 bean。

现在,我们可以根据环境或要求更改池大小、用户名或密码,但不会影响应用程序。

注意:encryptedSecurityDomain,我们需要在JBoss服务器中单独配置,如

<security-domain name="encryptedSecurityDomain" cache-type="default">
                    <authentication>
                        <login-module code="org.picketbox.datasource.security.SecureIdentityLoginModule" flag="required">
                            <module-option name="username" value="<usernamefordb>"/>
                            <module-option name="password" value="894c8a6aegc8d028ce169c596d67afd0"/>
                        </login-module>
                    </authentication>
                </security-domain>

这是用例之一。希望它澄清。

【讨论】:

【参考方案9】:

给我最好的解释是here

什么是 JNDI

它是一种提供对目录服务的访问的 API,即服务映射名称(字符串)与对象、对远程对象或简单数据的引用。这就是所谓的 捆绑。 这组绑定称为上下文。应用程序使用 JNDI 接口来访问资源。

简单地说,它就像一个带有字符串键和对象值的哈希图,代表网络上的资源。

JNDI 解决了什么问题

如果没有 JNDI,远程资源的位置或访问信息必须在应用程序中硬编码或在配置中可用。维护这些信息非常繁琐且容易出错。

例如,如果某个资源已通过另一个 IP 地址重新定位到另一台服务器上,则所有使用此资源的应用程序都必须使用此新信息进行更新。对于 JNDI,这不是必需的。只有相应的资源绑定需要更新。应用程序仍然可以通过其名称访问它,并且重定位是透明的。

【讨论】:

以上是关于什么是 JNDI?它的基本用途是什么?什么时候使用?的主要内容,如果未能解决你的问题,请参考以下文章

什么是支持向量机(SVM)以及它的用途?

Cython初窥

什么是 JSON,它的用途是什么?

JNDI的初步理解

什么是 REST / RESTful 以及它的用途是什么?

什么是REST / RESTful 以及它的用途是什么?