# 课程：命名和目录概念

> 原文： [https://docs.oracle.com/javase/tutorial/jndi/concepts/index.html](https://docs.oracle.com/javase/tutorial/jndi/concepts/index.html)

## 命名概念

任何计算系统中的基本设施是 _ 命名服务 _ - 根据名称找到与对象和对象相关联的名称的方法。使用几乎任何计算机程序或系统时，您总是在命名一个或另一个对象。例如，当您使用电子邮件系统时，您必须提供收件人的姓名。要访问计算机中的文件，您必须提供其名称。命名服务允许您查找给定名称的对象。

![A name is used to reference an object.](img/68fa50d9f94bbb8eb4519a4cb277a760.jpg)

命名服务的主要功能是将人员友好名称映射到对象，例如地址，标识符或计算机程序通常使用的对象。

例如，[互联网域名系统（DNS）](http://www.ietf.org/rfc/rfc1034.txt)将机器名称映射到 IP 地址：

```
www.example.com ==> 192.0.2.5

```

文件系统将文件名映射到程序可用于访问文件内容的文件引用。

```
c:\bin\autoexec.bat ==> File Reference

```

这两个示例还说明了存在命名服务的广泛范围 - 从命名 Internet 上的对象到命名本地文件系统上的文件。

## 名称

要在命名系统中查找对象，请为其提供对象的 _ 名称 _。命名系统确定名称必须遵循的语法。此语法有时称为命名系统 _ 命名约定 _。名称由组成部分组成。名称的表示由标记名称组件的组件分隔符组成。

| 命名系统 | 组件分隔符 | 名称 |
| --- | --- | --- |
| UNIX 文件系统 | “/” | 在/ usr /你好 |
| DNS | “” | sales.Wiz.COM |
| LDAP | “，”和“=” | cn = Rosanna Lee，o = Sun，c = US |

UNIX 文件系统的命名约定是文件是从其相对于文件系统根目录的路径命名的，路径中的每个组件都使用正斜杠字符（“/”）从左到右分隔。 UNIX _ 路径名 _， `/ usr / hello` ，例如，在文件目录 `usr` 中命名文件 `hello` ，该文件位于文件系统的根目录。

DNS 命名约定要求 DNS 名称中的组件从右到左排序，并由点字符（“。”）分隔。因此，DNS 名称 `sales.Wiz.COM` 相对于 DNS 条目 `Wiz.COM` 命名名称为 `sales` 的 DNS 条目。反过来，DNS 条目 `Wiz.COM` 在 `COM` 条目中命名名称为 `Wiz` 的条目。

[轻量级目录访问协议（LDAP）](http://www.ietf.org/rfc/rfc2251.txt)命名约定从右到左命令组件，由逗号字符（“，”）分隔。因此，LDAP 名称 `cn = Rosanna Lee，o = Sun，c = US` 命名 LDAP 条目 `cn = Rosanna Lee` ，相对于条目 `o = Sun` 反过来，相对于 `c = us` 。 LDAP 还有一个规则，即名称的每个组件都必须是名称/值对，其名称和值由等号（“=”）分隔。

## 绑定

名称与对象的关联称为 _ 绑定 _。文件名是 _ 绑定到文件的 _。

DNS 包含将计算机名称映射到 IP 地址的绑定。 LDAP 名称绑定到 LDAP 条目。

## 参考和地址

根据命名服务，命名服务不能直接存储某些对象;也就是说，对象的副本不能放在命名服务中。相反，它们必须通过引用存储;也就是说，对象的 _ 指针 _ 或 _ 引用 _ 被放置在命名服务中。引用表示有关如何访问对象的信息。通常，它是一种紧凑的表示，可用于与对象通信，而对象本身可能包含更多的状态信息。使用该引用，您可以联系该对象并获取有关该对象的更多信息。

例如，飞机物体可能包含飞机乘客和机组人员的列表，飞行计划，燃料和仪表状态，以及航班号和起飞时间。相比之下，飞机物体参考可能仅包含其航班号和起飞时间。该参考是关于飞机物体的信息的更紧凑的表示，并且可以用于获得附加信息。例如，使用 _ 文件引用 _ 访问文件对象。例如，打印机对象可能包含打印机的状态，例如其当前队列和纸盘中的纸张数量。另一方面，打印机对象引用可能仅包含有关如何到达打印机的信息，例如其打印服务器名称和打印协议。

虽然通常引用可以包含任何任意信息，但将其内容称为 _ 地址 _（或通信端点）是有用的：有关如何访问对象的特定信息。

为简单起见，本教程使用“object”来引用对象和对象引用，而不需要区分它们。

## 上下文

_ 上下文 _ 是一组名称到对象的绑定。每个上下文都有一个相关的命名约定。上下文始终提供返回对象的查找（_ 解析 _）操作，它通常还提供诸如绑定名称，解除绑定名称和列出绑定名称的操作。一个上下文对象中的名称可以绑定到具有相同命名约定的另一个上下文对象（称为 _ 子上下文 _）。

![Several examples of contexts, bound to subcontexts.](img/62086fc2065763b608516d9adc409443.jpg)

UNIX 文件系统中的文件目录（例如 `/ usr` ）表示上下文。相对于另一个文件目录命名的文件目录表示子上下文（UNIX 用户将其称为 _ 子目录 _）。也就是说，在文件目录 `/ usr / bin` 中，目录 `bin` 是 `usr` 的子上下文。 DNS 域，例如 `COM` ，表示上下文。相对于另一个 DNS 域命名的 DNS 域表示子上下文。对于 DNS 域 `Sun.COM` ，DNS 域 `Sun` 是 `COM` 的子上下文。

最后，LDAP 条目（例如 `c = us` ）表示上下文。相对于另一个 LDAP 条目命名的 LDAP 条目表示子上下文。对于 LDAP 条目 `o = sun，c = us` ，条目 `o = sun` 是 `c = us` 的子上下文。

## 命名系统和命名空间

_ 命名系统 _ 是相同类型的连接的一组上下文（它们具有相同的命名约定）并提供一组通用操作。

实现 DNS 的系统是命名系统。使用 LDAP 进行通信的系统是命名系统。

命名系统为其客户提供 _ 命名服务 _，以执行与命名相关的操作。命名服务通过其自己的接口访问。 DNS 提供命名服务，将机器名称映射到 IP 地址。 LDAP 提供了一个命名服务，可将 LDAP 名称映射到 LDAP 条目。文件系统提供命名服务，将文件名映射到文件和目录。

_ 命名空间 _ 是命名系统中所有可能名称的集合。 UNIX 文件系统具有一个名称空间，该名称空间由该文件系统中的所有文件和目录名称组成。 DNS 命名空间包含 DNS 域和条目的名称。 LDAP 名称空间包含 LDAP 条目的名称。