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


Answers:


241

什么是JNDI?

它代表Java命名和目录接口

它的基本用途是什么?

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

什么时候使用?

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

这有几个优点:

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

9
因此,这基本上是在jdbc连接信息中包含属性文件的更安全替代方法?
grinch 2014年

4
@grinch:基本上是。它更安全,更标准化,因此使部署更加容易(无需猜测属性文件的名称必须是什么,等等)。
sleske 2014年

那么使用环境变量和JNDI有什么区别?是类似的概念吗?
skryvets

100

什么是JNDI?

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

它的基本用途是什么?

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

在此处输入图片说明

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

  1. 轻型目录访问协议(LDAP)
  2. 通用对象请求代理体系结构(CORBA)通用对象服务(COS)名称服务
  3. Java远程方法调用(RMI)注册表

因此,基本上,您可以创建对象并将其注册到目录服务中,以供日后查找和执行操作。


30

从外行角度讲,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");

1
这只是图片的一部分。JNDI使您可以查找Java对象-它们可以是数据源之类的资源,甚至可以是其他一些资源,甚至可以简单地java.lang.String用于配置信息。
sleske 2014年

3
@sleske,我建议您自己回答。
2013年

14

JNDI概述

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

JNDI的定义也独立于任何特定的命名或目录服务实现。它使应用程序可以使用通用API访问不同的(可能是多个的)命名和目录服务。可以将不同的命名和目录服务提供程序无缝地插入此通用API的后面。这使基于Java技术的应用程序能够利用各种现有命名和目录服务(例如LDAP,NDS,DNS和NIS(YP))中的信息,并使这些应用程序与旧版软件和系统共存。

使用JNDI作为工具,您可以构建新的功能强大且可移植的应用程序,这些应用程序不仅可以利用Java的对象模型,而且可以与部署它们的环境很好地集成在一起。

参考


9

什么是JNDI?

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

它的基本用途是什么?

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

什么时候使用?

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


7

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

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


3

我很好奇为什么官方文档如此被忽略,而这些细节已经精心制作了。

但是,如果您想了解这些情况,请参阅duffymo的答案

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

及其架构

在此处输入图片说明

以及通常如何使用它


5
I am just curious why the official docs are so ignored which elaborate the details meticulously already也许是因为他们没有以普通人能理解的充分方式进行解释?
skryvets

1

我将使用一个示例来说明如何在没有任何应用程序开发人员知道数据库的用户名和密码的情况下使用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名称及其关联的数据源对象将可用于我们的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>

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


0

给我最好的解释在这里

什么是JNDI

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

简而言之,它就像一个带有String键和代表Web资源的Object值的hashmap。

JNDI解决了哪些问题

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.