什么是JNDI?
它的基本用途是什么?
什么时候使用?
JNDI概述
JNDI是Java中指定的API 提供命名和 目录功能 用Java编写的应用程序 编程语言。它的设计 特别是对于Java平台的使用 Java的对象模型。使用JNDI, 基于Java技术的应用程序 可以存储和检索命名Java 任何类型的对象。此外,JNDI 提供用于执行的方法 标准目录操作,例如 将属性与对象关联 和搜索对象使用他们的 属性。< / p > JNDI也被定义为独立于 任何特定的命名或目录 服务实现。它使 应用程序访问不同, 可能有多个,命名和 目录服务使用公共API。 不同的命名和目录服务 提供者可以无缝地插入 这个通用API的背后。这使 基于Java技术的应用程序 充分利用信息 多种现有的命名和 目录服务,如LDAP、NDS、 DNS, NIS(YP),以及启用 与之共存的应用程序 使用JNDI作为工具,您可以构建 新的功能强大的便携式应用程序 它不仅利用了Java的优势 对象模型不过也是 与环境良好结合
JNDI是Java中指定的API 提供命名和 目录功能 用Java编写的应用程序 编程语言。它的设计 特别是对于Java平台的使用 Java的对象模型。使用JNDI, 基于Java技术的应用程序 可以存储和检索命名Java 任何类型的对象。此外,JNDI 提供用于执行的方法 标准目录操作,例如 将属性与对象关联 和搜索对象使用他们的 属性。< / p >
JNDI也被定义为独立于 任何特定的命名或目录 服务实现。它使 应用程序访问不同, 可能有多个,命名和 目录服务使用公共API。 不同的命名和目录服务 提供者可以无缝地插入 这个通用API的背后。这使 基于Java技术的应用程序 充分利用信息 多种现有的命名和 目录服务,如LDAP、NDS、 DNS, NIS(YP),以及启用 与之共存的应用程序
Reference .
什么是JNDI ?
它代表Java命名和目录接口。
JNDI允许分布式应用程序以抽象的、独立于资源的方式查找服务。
最常见的用例是在Java EE应用服务器上设置数据库连接池。部署在该服务器上的任何应用程序都可以使用JNDI名称java:comp/env/FooBarPool访问所需的连接,而不必知道有关连接的详细信息。
java:comp/env/FooBarPool
这有几个优点:
devl->int->test->prod
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命名和目录接口。它是J2EE的标准。
使用这个API,您可以访问许多类型的数据,如对象、设备、命名文件和目录服务。EJB使用它来查找远程对象。JNDI旨在提供一个公共接口来访问现有的服务,如DNS、NDS、LDAP、CORBA和RMI。
您可以使用JNDI执行命名操作,包括读取操作和更新名称空间的操作。下面的操作描述在这里。
Java命名和目录接口__abc0 (JNDI)是一个应用程序编程接口(API),为使用JavaTM编程语言编写的应用程序提供命名和目录功能。它被定义为独立于任何特定的目录服务实现。因此,可以以通用的方式访问各种目录(新目录、新目录和已经部署的目录)。
上面的答案涵盖了大部分内容,但我想在这里提供架构,以便上面的内容更有意义。
要使用JNDI,您必须拥有JNDI类和一个或多个服务提供者。Java 2 SDK v1.3包含三个服务提供者,用于以下命名/目录服务:
所以基本上你创建对象并在目录服务上注册它们,然后你可以在目录服务上进行查找和执行操作。
命名服务将名称与对象关联起来,并根据对象的给定名称查找对象。(RMI注册表是命名服务的一个很好的例子。)JNDI为许多现有的命名服务(如LDAP、DNS)提供了一个公共接口。
如果没有JNDI,远程资源的位置或访问信息必须硬编码在应用程序中或在配置中可用。维护这些信息非常繁琐,而且容易出错。
我只是好奇为什么官方文档被如此忽视,它已经精心地详细说明了细节。
但如果你想了解这些情况,请参考< em > duffymo的回答< / em >。
Java命名和目录接口__abc0 (JNDI)是一个应用程序编程接口(API),为使用JavaTM编程语言编写的应用程序提供命名和目录功能。它被定义为独立于任何特定的目录服务实现。因此,可以以通用的方式访问各种目录——新的、正在出现的和已经部署的目录。
以及它的结构
通常是如何使用。
我将使用一个示例来说明如何在应用程序开发人员不知道数据库用户名和密码的情况下使用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>
这是其中一个用例。希望它能澄清。
我认为最好的解释是在这里
什么是JNDI
它是一个API,提供对目录服务的访问,也就是服务映射名称(字符串)与对象、对远程对象或简单数据的引用。这叫做 绑定。绑定的集合称为上下文。应用程序使用JNDI接口访问资源 简单地说,它就像一个带有String键和Object值的hashmap,表示web上的资源。
简单地说,它就像一个带有String键和Object值的hashmap,表示web上的资源。
JNDI解决了什么问题
如果没有JNDI,远程资源的位置或访问信息必须硬编码在应用程序中或在配置中可用。维护这些信息非常繁琐,而且容易出错。 如果某个资源已被重新定位到另一台服务器上(例如,使用另一个IP地址),则使用该资源的所有应用程序都必须使用此新信息进行更新。对于JNDI,这是不必要的。只需要更新相应的资源绑定。应用程序仍然可以通过它的名称访问它,并且重定位是透明的。
如果某个资源已被重新定位到另一台服务器上(例如,使用另一个IP地址),则使用该资源的所有应用程序都必须使用此新信息进行更新。对于JNDI,这是不必要的。只需要更新相应的资源绑定。应用程序仍然可以通过它的名称访问它,并且重定位是透明的。
Java命名和目录接口(JNDI)是一个应用程序编程接口(API),为使用JavaTM编程语言编写的应用程序提供命名和目录功能。它被定义为独立于任何特定的目录服务实现。因此,可以以通用的方式访问各种目录——新的、正在出现的和已经部署的目录。
尽管JNDI在轻量级、容器化的Java应用程序(如Spring Boot)中扮演的角色较少,但还有其他用途。仍然使用JNDI的三种Java技术是JDBC、EJB和JMS。它们在Java企业应用程序中都有广泛的用途。
例如,一个独立的DevOps团队可能在所有环境中管理敏感数据库连接的用户名和密码等环境变量。JNDI资源可以在web应用程序容器中创建,JNDI被用作在所有环境中工作的一致抽象层。
这种设置允许开发人员为开发目的创建和控制本地定义,同时通过相同的JNDI名称连接到生产环境中的敏感资源。