【发布时间】:2011-05-20 22:04:35
【问题描述】:
什么是JNDI?
它的基本用途是什么?
什么时候使用?
【问题讨论】:
-
定义和用例见个人博文:tshikatshikaaa.blogspot.com/2013/01/…
-
2021 年 12 月签到...你不想知道我们对 JNDI 的看法 :)
标签: jndi
什么是JNDI?
它的基本用途是什么?
什么时候使用?
【问题讨论】:
标签: jndi
JNDI 概述
JNDI 是 Java 中指定的 API 提供命名和 目录功能 用 Java 编写的应用程序 编程语言。它被设计 特别是对于 Java 平台使用 Java的对象模型。使用 JNDI, 基于Java技术的应用程序 可以存储和检索命名的Java 任何类型的对象。此外,JNDI 提供执行方法 标准目录操作,例如 将属性与对象关联 并使用他们的搜索对象 属性。
JNDI 的定义也独立于 任何特定的命名或目录 服务实施。它使 访问不同的应用程序, 可能是多个,命名和 使用通用 API 的目录服务。 不同的命名和目录服务 提供者可以无缝插入 在这个通用 API 的背后。这使 基于 Java 技术的应用程序 充分利用信息 各种现有的命名和 目录服务,例如 LDAP、NDS、 DNS 和 NIS(YP),以及启用 共存的应用程序 遗留软件和系统。
使用 JNDI 作为工具,您可以构建 新的强大和便携的应用程序 不仅可以利用 Java 的 对象模型,但也是 与环境融为一体 部署它们的位置。
【讨论】:
什么是 JNDI?
它代表Java Naming and Directory Interface。
它的基本用途是什么?
JNDI 允许分布式应用程序以一种抽象的、与资源无关的方式查找服务。
什么时候用?
最常见的用例是在 Java EE 应用服务器上设置数据库连接池。部署在该服务器上的任何应用程序都可以使用 JNDI 名称 java:comp/env/FooBarPool 访问所需的连接,而无需了解有关连接的详细信息。
这有几个优点:
devl->int->test->prod 环境移动的部署顺序,您可以在每个环境中使用相同的 JNDI 名称并隐藏正在使用的实际数据库。应用程序在环境之间迁移时不必更改。【讨论】:
通俗地说,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");
【讨论】:
java.lang.String 以获取配置信息。
什么是 JNDI?
JNDI 代表 Java 命名和目录接口。它是 J2EE 的标准配置。
它的基本用途是什么?
使用此 API,您可以访问多种类型的数据,例如对象、设备、命名文件和目录服务,例如。 EJB 使用它来查找远程对象。 JNDI 旨在提供一个通用接口来访问现有服务,如 DNS、NDS、LDAP、CORBA 和 RMI。
什么时候使用?
您可以使用 JNDI 执行命名操作,包括读取操作和更新命名空间的操作。以下操作描述here。
【讨论】:
什么是 JNDI?
Java 命名和目录接口TM (JNDI) 是一种应用程序编程接口 (API),它为使用 JavaTM 编程语言编写的应用程序提供命名和目录功能.它被定义为独立于任何特定的目录服务实现。因此,可以以通用方式访问各种目录(新的、新兴的和已部署的)。
它的基本用途是什么?
上面的答案中涵盖了大部分内容,但我想在这里提供架构,以便上面更有意义。
要使用 JNDI,您必须拥有 JNDI 类和一个或多个服务提供者。 Java 2 SDK,v1.3 包括三个服务提供者,用于以下命名/目录服务:
所以基本上你创建对象并将它们注册到目录服务上,你以后可以对其进行查找和执行操作。
【讨论】:
命名服务将名称与对象相关联,并根据给定的名称查找对象。(RMI 注册表是命名服务的一个很好的例子。)JNDI 为许多现有的命名服务提供了一个通用接口,例如 LDAP、DNS。
如果没有 JNDI,远程资源的位置或访问信息必须在应用程序中硬编码或在配置中可用。维护这些信息非常繁琐且容易出错。
【讨论】:
我只是好奇为什么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 也许是因为他们没有以普通人能够理解的充分方式解释?
我将使用一个示例来解释如何使用 JNDI 来配置数据库,而无需任何应用程序开发人员知道数据库的用户名和密码。
1) 我们已经在 JBoss 服务器的 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>
这是用例之一。希望它澄清。
【讨论】:
给我最好的解释是here
什么是 JNDI
它是一种提供对目录服务的访问的 API,即服务映射名称(字符串)与对象、对远程对象或简单数据的引用。这就是所谓的 捆绑。 这组绑定称为上下文。应用程序使用 JNDI 接口来访问资源。
简单地说,它就像一个带有字符串键和对象值的哈希图,代表网络上的资源。
JNDI 解决了什么问题
如果没有 JNDI,远程资源的位置或访问信息必须在应用程序中硬编码或在配置中可用。维护这些信息非常繁琐且容易出错。
例如,如果某个资源已通过另一个 IP 地址重新定位到另一台服务器上,则所有使用此资源的应用程序都必须使用此新信息进行更新。对于 JNDI,这不是必需的。只有相应的资源绑定需要更新。应用程序仍然可以通过其名称访问它,并且重定位是透明的。
【讨论】: