模块 java.naming

类 InitialContext

java.lang.Object
javax.naming.InitialContext
所有已实现的接口:
Context
已知子类:
InitialDirContext

public class InitialContext extends Object implements Context
此类是执行命名操作的起始上下文。

所有命名操作都与上下文相关。初始上下文实现 Context 接口并提供名称解析的起点。

构造初始上下文时,其环境会使用传递给构造函数的环境参数以及任何 应用程序资源文件 中定义的属性进行初始化。

JNDI 通过按顺序合并来自以下两个来源的值来确定每个属性的值:

  1. 第一次出现的属性来自构造方法的环境参数和系统属性。
  2. 应用程序资源文件 (jndi.properties)。
对于在这两个源或多个应用程序资源文件中找到的每个属性,属性值按如下方式确定。如果该属性是指定 JNDI 工厂列表的标准 JNDI 属性之一(请参阅 Context ),则所有值都将连接到一个以冒号分隔的列表中。对于其他属性,仅使用找到的第一个值。

初始上下文实现在运行时确定。默认策略使用环境属性“java.naming.factory.initial ”,其中包含初始上下文工厂的类名。如下所述,在解析 URL 字符串时会出现此策略的例外情况。

当 URL 字符串(形式为 scheme_id:rest_of_nameString )作为名称参数传递给任何方法时,用于处理该方案的 URL 上下文工厂将被定位并用于解析 URL。如果找不到这样的工厂,则使用 "java.naming.factory.initial" 指定的初始上下文。类似地,当第一个组件是 URL 字符串的 CompositeName 对象作为名称参数传递给任何方法时,将找到一个 URL 上下文工厂并将其用于解析名字组件。请参阅 NamingManager.getURLContext() 了解 URL 上下文工厂的定位方式。

这种定位初始上下文和 URL 上下文工厂的默认策略可以通过调用 NamingManager.setInitialContextFactoryBuilder() 来覆盖。

当无法实例化初始上下文时抛出 NoInitialContextException。此异常可以在与 InitialContext 的任何交互期间抛出,而不仅仅是在构造 InitialContext 时抛出。例如,初始上下文的实现可能仅在调用实际方法时才延迟检索上下文。应用程序不应依赖于何时确定初始上下文的存在。

当环境属性“java.naming.factory.initial”为非空时,InitialContext 构造方法将尝试创建其中指定的初始上下文。那时,如果遇到问题,涉及的初始上下文工厂可能会抛出异常。但是,当它验证并向初始上下文的用户指示任何与环境属性或连接相关的问题时,它依赖于提供者实现。它可以懒惰地这样做——延迟到对上下文执行操作,或者急切地,在构建上下文时。

InitialContext 实例与多个线程的并发访问不同步。每个操作不同 InitialContext 实例的多个线程不需要同步。需要同时访问单个 InitialContext 实例的线程应该在它们之间同步并提供必要的锁定。

自从:
1.3, JNDI 1.1
参见:
  • 字段详细信息

  • 构造方法详细信息

    • InitialContext

      protected InitialContext(boolean lazy) throws NamingException
      构造一个初始上下文,并可选择不对其进行初始化。当调用 InitialContext 构造函数时环境参数的值未知时,子类中的构造函数可能会使用它。子类的构造函数将调用此构造函数,计算环境值,然后在返回前调用init()
      参数:
      lazy - true 表示不初始化初始上下文; false 相当于调用 new InitialContext()
      抛出:
      NamingException - 如果遇到命名异常
      自从:
      1.3
      参见:
    • InitialContext

      public InitialContext() throws NamingException
      构造初始上下文。没有提供环境属性。相当于 new InitialContext(null)
      抛出:
      NamingException - 如果遇到命名异常
      参见:
    • InitialContext

      public InitialContext(Hashtable <?,?> environment) throws NamingException
      使用提供的环境构造初始上下文。类描述中讨论了环境属性。

      此构造函数不会修改 environment 或保存对它的引用,但可能会保存一个克隆。 environment 传递给构造函数后,调用者不应修改可变键和值。

      参数:
      environment - 用于创建初始上下文的环境。 Null 表示空环境。
      抛出:
      NamingException - 如果遇到命名异常
  • 方法详情

    • init

      protected void init(Hashtable <?,?> environment) throws NamingException
      使用提供的环境初始化初始上下文。类描述中讨论了环境属性。

      此方法将修改 environment 并保存对它的引用。调用者可能不再修改它。

      参数:
      environment - 用于创建初始上下文的环境。 Null 表示空环境。
      抛出:
      NamingException - 如果遇到命名异常
      自从:
      1.3
      参见:
    • doLookup

      public static <T> T doLookup(Name  name) throws NamingException
      检索命名对象的静态方法。这是一个相当于调用的快捷方法:

      InitialContext ic = new InitialContext(); Object obj = ic.lookup();

      如果 name 为空,则返回此上下文的新实例(表示与此上下文相同的命名上下文,但其环境可能会被独立修改,并且可能会被并发访问)。

      类型参数:
      T - 返回对象的类型
      参数:
      name - 要查找的对象的名称
      返回:
      绑定到 name 的对象
      抛出:
      NamingException - 如果遇到命名异常
      自从:
      1.6
      参见:
    • doLookup

      public static <T> T doLookup(String  name) throws NamingException
      检索命名对象的静态方法。有关详细信息,请参阅 doLookup(Name)
      类型参数:
      T - 返回对象的类型
      参数:
      name - 要查找的对象的名称
      返回:
      绑定到 name 的对象
      抛出:
      NamingException - 如果遇到命名异常
      自从:
      1.6
    • getDefaultInitCtx

      protected Context  getDefaultInitCtx() throws NamingException
      通过调用 NamingManager.getInitialContext() 检索初始上下文并将其缓存在 defaultInitCtx 中。设置 gotDefault 以便我们知道我们之前已经尝试过。
      返回:
      非空缓存的初始上下文。
      抛出:
      NoInitialContextException - 如果找不到初始上下文。
      NamingException - 如果遇到命名异常。
    • getURLOrDefaultInitCtx

      protected Context  getURLOrDefaultInitCtx(String  name) throws NamingException
      检索用于解析字符串名称 name 的上下文。如果 name name 是 URL 字符串,则尝试为其查找 URL 上下文。如果没有找到,或者如果 name 不是 URL 字符串,则返回 getDefaultInitCtx()

      有关子类应如何使用此方法的说明,请参阅 getURLOrDefaultInitCtx(Name)。

      参数:
      name - 要为其获取上下文的非空名称。
      返回:
      name 的 URL 上下文或缓存的初始上下文。结果不能为空。
      抛出:
      NoInitialContextException - 如果找不到初始上下文。
      NamingException - 遇到命名异常。
      参见:
    • getURLOrDefaultInitCtx

      protected Context  getURLOrDefaultInitCtx(Name  name) throws NamingException
      检索用于解析 name 的上下文。如果 name 名称的第一个组件是 URL 字符串,则尝试为其查找 URL 上下文。如果没有找到,或者如果 name 的第一个组件不是 URL 字符串,则返回 getDefaultInitCtx()

      创建 InitialContext 的子类时,按如下方式使用此方法。定义一个新方法,该方法使用此方法获取所需子类的初始上下文。

       protected XXXContext getURLOrDefaultInitXXXCtx(Name name)
       throws NamingException {
       Context answer = getURLOrDefaultInitCtx(name);
       if (!(answer instanceof XXXContext)) {
        if (answer == null) {
         throw new NoInitialContextException();
        } else {
         throw new NotContextException("Not an XXXContext");
        }
       }
       return (XXXContext)answer;
       }
       
      在为子类中的新方法提供实现时,使用这个新定义的方法来获取初始上下文。
       public Object XXXMethod1(Name name, ...) {
       throws NamingException {
        return getURLOrDefaultInitXXXCtx(name).XXXMethod1(name, ...);
       }
       
      参数:
      name - 要为其获取上下文的非空名称。
      返回:
      name 的 URL 上下文或缓存的初始上下文。结果不能为空。
      抛出:
      NoInitialContextException - 如果找不到初始上下文。
      NamingException - 遇到命名异常。
      参见:
    • lookup

      public Object  lookup(String  name) throws NamingException
      从接口 Context 复制的描述
      检索命名对象。有关详细信息,请参阅 Context.lookup(Name)
      指定者:
      lookup 在接口 Context
      参数:
      name - 要查找的对象的名称
      返回:
      绑定到 name 的对象
      抛出:
      NamingException - 如果遇到命名异常
    • lookup

      public Object  lookup(Name  name) throws NamingException
      从接口 Context 复制的描述
      检索命名对象。如果 name 为空,则返回此上下文的新实例(表示与此上下文相同的命名上下文,但其环境可能会被独立修改,并且可能会被并发访问)。
      指定者:
      lookup 在接口 Context
      参数:
      name - 要查找的对象的名称
      返回:
      绑定到 name 的对象
      抛出:
      NamingException - 如果遇到命名异常
      参见:
    • bind

      public void bind(String  name, Object  obj) throws NamingException
      从接口 Context 复制的描述
      将名称绑定到对象。有关详细信息,请参阅 Context.bind(Name, Object)
      指定者:
      bind 在接口 Context
      参数:
      name - 要绑定的名称;可能不为空
      obj - 要绑定的对象;可能为空
      抛出:
      NameAlreadyBoundException - 如果名称已经绑定
      InvalidAttributesException - 如果对象没有提供所有强制属性
      NamingException - 如果遇到命名异常
    • bind

      public void bind(Name  name, Object  obj) throws NamingException
      从接口 Context 复制的描述
      将名称绑定到对象。所有中间上下文和目标上下文(由名称的终端原子组件以外的所有内容命名)必须已经存在。
      指定者:
      bind 在接口 Context
      参数:
      name - 要绑定的名称;可能不为空
      obj - 要绑定的对象;可能为空
      抛出:
      NameAlreadyBoundException - 如果名称已经绑定
      InvalidAttributesException - 如果对象没有提供所有强制属性
      NamingException - 如果遇到命名异常
      参见:
    • rebind

      public void rebind(String  name, Object  obj) throws NamingException
      从接口 Context 复制的描述
      将名称绑定到对象,覆盖任何现有绑定。有关详细信息,请参阅 Context.rebind(Name, Object)
      指定者:
      rebind 在接口 Context
      参数:
      name - 要绑定的名称;可能不为空
      obj - 要绑定的对象;可能为空
      抛出:
      InvalidAttributesException - 如果对象没有提供所有强制属性
      NamingException - 如果遇到命名异常
    • rebind

      public void rebind(Name  name, Object  obj) throws NamingException
      从接口 Context 复制的描述
      将名称绑定到对象,重写任何现有绑定。所有中间上下文和目标上下文(由名称的终端原子组件以外的所有内容命名)必须已经存在。

      如果对象是 DirContext ,则与名称关联的任何现有属性都将替换为对象的属性。否则,与名称关联的任何现有属性都保持不变。

      指定者:
      rebind 在接口 Context
      参数:
      name - 要绑定的名称;可能不为空
      obj - 要绑定的对象;可能为空
      抛出:
      InvalidAttributesException - 如果对象没有提供所有强制属性
      NamingException - 如果遇到命名异常
      参见:
    • unbind

      public void unbind(String  name) throws NamingException
      从接口 Context 复制的描述
      解除绑定命名对象。有关详细信息,请参阅 Context.unbind(Name)
      指定者:
      unbind 在接口 Context
      参数:
      name - 要解除绑定的名称;可能不为空
      抛出:
      NameNotFoundException - 如果中间上下文不存在
      NamingException - 如果遇到命名异常
    • unbind

      public void unbind(Name  name) throws NamingException
      从接口 Context 复制的描述
      解除绑定命名对象。从目标上下文中删除 name 中的终端原子名称——除了 name 的终端原子部分之外的所有名称。

      这个方法是幂等的。即使终端原子名称未绑定到目标上下文中,它也会成功,但如果任何中间上下文不存在,则会抛出 NameNotFoundException

      与名称关联的任何属性都将被删除。中间上下文没有改变。

      指定者:
      unbind 在接口 Context
      参数:
      name - 要解除绑定的名称;可能不为空
      抛出:
      NameNotFoundException - 如果中间上下文不存在
      NamingException - 如果遇到命名异常
      参见:
    • rename

      public void rename(String  oldName, String  newName) throws NamingException
      从接口 Context 复制的描述
      将新名称绑定到绑定到旧名称的对象,并取消绑定旧名称。有关详细信息,请参阅 Context.rename(Name, Name)
      指定者:
      rename 在接口 Context
      参数:
      oldName - 现有绑定的名称;可能不为空
      newName - 新绑定的名称;可能不为空
      抛出:
      NameAlreadyBoundException - 如果 newName 已经绑定
      NamingException - 如果遇到命名异常
    • rename

      public void rename(Name  oldName, Name  newName) throws NamingException
      从接口 Context 复制的描述
      将新名称绑定到绑定到旧名称的对象,并取消绑定旧名称。这两个名称都与此上下文有关。与旧名称相关联的任何属性都将与新名称相关联。旧名称的中间上下文不会更改。
      指定者:
      rename 在接口 Context
      参数:
      oldName - 现有绑定的名称;可能不为空
      newName - 新绑定的名称;可能不为空
      抛出:
      NameAlreadyBoundException - 如果 newName 已经绑定
      NamingException - 如果遇到命名异常
      参见:
    • list

      public NamingEnumeration <NameClassPair > list(String  name) throws NamingException
      从接口 Context 复制的描述
      枚举命名上下文中绑定的名称,以及绑定到它们的对象的类名。有关详细信息,请参阅 Context.list(Name)
      指定者:
      list 在接口 Context
      参数:
      name - 要列出的上下文的名称
      返回:
      此上下文中绑定的名称和类名称的枚举。枚举的每个元素都是 NameClassPair 类型。
      抛出:
      NamingException - 如果遇到命名异常
    • list

      public NamingEnumeration <NameClassPair > list(Name  name) throws NamingException
      从接口 Context 复制的描述
      枚举命名上下文中绑定的名称,以及绑定到它们的对象的类名。不包括任何子上下文的内容。

      如果将绑定添加到此上下文或从中删除,则其对先前返回的枚举的影响是未定义的。

      指定者:
      list 在接口 Context
      参数:
      name - 要列出的上下文的名称
      返回:
      此上下文中绑定的名称和类名称的枚举。枚举的每个元素都是 NameClassPair 类型。
      抛出:
      NamingException - 如果遇到命名异常
      参见:
    • listBindings

      public NamingEnumeration <Binding > listBindings(String  name) throws NamingException
      从接口 Context 复制的描述
      枚举命名上下文中绑定的名称,以及绑定到它们的对象。有关详细信息,请参阅 Context.listBindings(Name)
      指定者:
      listBindings 在接口 Context
      参数:
      name - 要列出的上下文的名称
      返回:
      此上下文中绑定的枚举。枚举的每个元素都是 Binding 类型。
      抛出:
      NamingException - 如果遇到命名异常
    • listBindings

      public NamingEnumeration <Binding > listBindings(Name  name) throws NamingException
      从接口 Context 复制的描述
      枚举命名上下文中绑定的名称,以及绑定到它们的对象。不包括任何子上下文的内容。

      如果将绑定添加到此上下文或从中删除,则其对先前返回的枚举的影响是未定义的。

      指定者:
      listBindings 在接口 Context
      参数:
      name - 要列出的上下文的名称
      返回:
      此上下文中绑定的枚举。枚举的每个元素都是 Binding 类型。
      抛出:
      NamingException - 如果遇到命名异常
      参见:
    • destroySubcontext

      public void destroySubcontext(String  name) throws NamingException
      从接口 Context 复制的描述
      销毁命名上下文并将其从命名空间中删除。有关详细信息,请参阅 Context.destroySubcontext(Name)
      指定者:
      destroySubcontext 在接口 Context
      参数:
      name - 要销毁的上下文的名称;可能不为空
      抛出:
      NameNotFoundException - 如果中间上下文不存在
      NotContextException - 如果名称已绑定但未命名上下文,或未命名适当类型的上下文
      ContextNotEmptyException - 如果命名上下文不为空
      NamingException - 如果遇到命名异常
    • destroySubcontext

      public void destroySubcontext(Name  name) throws NamingException
      从接口 Context 复制的描述
      销毁命名上下文并将其从命名空间中删除。与该名称关联的任何属性也将被删除。中间上下文不会被破坏。

      这个方法是幂等的。即使终端原子名称未绑定到目标上下文中,它也会成功,但如果任何中间上下文不存在,则会抛出 NameNotFoundException

      在联合命名系统中,来自一个命名系统的上下文可以绑定到另一个命名系统中的名称。随后可以使用复合名称查找外部上下文并对其执行操作。但是,使用此复合名称破坏上下文的尝试将失败并返回 NotContextException ,因为外部上下文不是它所绑定的上下文的“子上下文”。相反,使用 unbind() 删除外部上下文的绑定。销毁外部上下文需要 destroySubcontext() 在来自外部上下文的“本地”命名系统的上下文上执行。

      指定者:
      destroySubcontext 在接口 Context
      参数:
      name - 要销毁的上下文的名称;可能不为空
      抛出:
      NameNotFoundException - 如果中间上下文不存在
      NotContextException - 如果名称已绑定但未命名上下文,或未命名适当类型的上下文
      ContextNotEmptyException - 如果命名上下文不为空
      NamingException - 如果遇到命名异常
      参见:
    • createSubcontext

      public Context  createSubcontext(String  name) throws NamingException
      从接口 Context 复制的描述
      创建并绑定一个新的上下文。有关详细信息,请参阅 Context.createSubcontext(Name)
      指定者:
      createSubcontext 在接口 Context
      参数:
      name - 要创建的上下文的名称;可能不为空
      返回:
      新创建的上下文
      抛出:
      NameAlreadyBoundException - 如果名称已经绑定
      InvalidAttributesException - 如果创建子上下文需要指定强制属性
      NamingException - 如果遇到命名异常
    • createSubcontext

      public Context  createSubcontext(Name  name) throws NamingException
      从接口 Context 复制的描述
      创建并绑定一个新的上下文。使用给定的名称创建一个新上下文并将其绑定到目标上下文(由名称的终端原子组件以外的所有内容命名)。所有中间上下文和目标上下文必须已经存在。
      指定者:
      createSubcontext 在接口 Context
      参数:
      name - 要创建的上下文的名称;可能不为空
      返回:
      新创建的上下文
      抛出:
      NameAlreadyBoundException - 如果名称已经绑定
      InvalidAttributesException - 如果创建子上下文需要指定强制属性
      NamingException - 如果遇到命名异常
      参见:
    • lookupLink

      public Object  lookupLink(String  name) throws NamingException
      从接口 Context 复制的描述
      检索命名对象,除了名称的终端原子组件之外的链接。有关详细信息,请参阅 Context.lookupLink(Name)
      指定者:
      lookupLink 在接口 Context
      参数:
      name - 要查找的对象的名称
      返回:
      绑定到 name 的对象,不遵循终端链接(如果有)
      抛出:
      NamingException - 如果遇到命名异常
    • lookupLink

      public Object  lookupLink(Name  name) throws NamingException
      从接口 Context 复制的描述
      检索命名对象,除了名称的终端原子组件之外的链接。如果绑定到 name 的对象不是链接,则返回对象本身。
      指定者:
      lookupLink 在接口 Context
      参数:
      name - 要查找的对象的名称
      返回:
      绑定到 name 的对象,不遵循终端链接(如果有)。
      抛出:
      NamingException - 如果遇到命名异常
      参见:
    • getNameParser

      public NameParser  getNameParser(String  name) throws NamingException
      从接口 Context 复制的描述
      检索与命名上下文关联的解析器。有关详细信息,请参阅 Context.getNameParser(Name)
      指定者:
      getNameParser 在接口 Context
      参数:
      name - 从中获取解析器的上下文的名称
      返回:
      可以将复合名称解析为其原子组件的名称解析器
      抛出:
      NamingException - 如果遇到命名异常
    • getNameParser

      public NameParser  getNameParser(Name  name) throws NamingException
      从接口 Context 复制的描述
      检索与命名上下文关联的解析器。在命名空间联合中,不同的命名系统将以不同的方式解析名称。此方法允许应用程序获取解析器,以使用特定命名系统的命名约定将名称解析为其原子组件。在任何单一命名系统中,此方法返回的 NameParser 对象必须相等(使用 equals() 测试)。
      指定者:
      getNameParser 在接口 Context
      参数:
      name - 从中获取解析器的上下文的名称
      返回:
      可以将复合名称解析为其原子组件的名称解析器
      抛出:
      NamingException - 如果遇到命名异常
      参见:
    • composeName

      public String  composeName(String  name, String  prefix) throws NamingException
      将此上下文的名称与相对于此上下文的名称组合在一起。由于初始上下文可能永远不会相对于除自身以外的任何上下文命名,因此 prefix 参数的值必须为空名称 ("")。
      指定者:
      composeName 在接口 Context
      参数:
      name - 相对于此上下文的名称
      prefix - 此上下文相对于其祖先之一的名称
      返回:
      prefixname的组成
      抛出:
      NamingException - 如果遇到命名异常
    • composeName

      public Name  composeName(Name  name, Name  prefix) throws NamingException
      将此上下文的名称与相对于此上下文的名称组合在一起。由于初始上下文可能永远不会相对于除自身以外的任何上下文命名,因此 prefix 参数的值必须为空名称。
      指定者:
      composeName 在接口 Context
      参数:
      name - 相对于此上下文的名称
      prefix - 此上下文相对于其祖先之一的名称
      返回:
      prefixname的组成
      抛出:
      NamingException - 如果遇到命名异常
      参见:
    • addToEnvironment

      public Object  addToEnvironment(String  propName, Object  propVal) throws NamingException
      从接口 Context 复制的描述
      将新的环境属性添加到此上下文的环境中。如果该属性已存在,则其值将被重写。有关环境属性的更多详细信息,请参阅类描述。
      指定者:
      addToEnvironment 在接口 Context
      参数:
      propName - 要添加的环境属性的名称;不能为空
      propVal - 要添加的属性的值;不能为空
      返回:
      该属性的先前值,如果该属性之前不在环境中,则为 null
      抛出:
      NamingException - 如果遇到命名异常
      参见:
    • removeFromEnvironment

      public Object  removeFromEnvironment(String  propName) throws NamingException
      从接口 Context 复制的描述
      从此上下文的环境中删除环境属性。有关环境属性的更多详细信息,请参阅类描述。
      指定者:
      removeFromEnvironment 在接口 Context
      参数:
      propName - 要删除的环境属性的名称;不能为空
      返回:
      属性的先前值,如果属性不在环境中则为 null
      抛出:
      NamingException - 如果遇到命名异常
      参见:
    • getEnvironment

      public Hashtable <?,?> getEnvironment() throws NamingException
      从接口 Context 复制的描述
      检索对此上下文有效的环境。有关环境属性的更多详细信息,请参阅类描述。

      调用者不应对返回的对象进行任何更改:它们对上下文的影响是未定义的。可以使用 addToEnvironment()removeFromEnvironment() 更改此上下文的环境。

      指定者:
      getEnvironment 在接口 Context
      返回:
      这个上下文的环境;永不为空
      抛出:
      NamingException - 如果遇到命名异常
      参见:
    • close

      public void close() throws NamingException
      从接口 Context 复制的描述
      关闭此上下文。此方法立即释放此上下文的资源,而不是等待它们被垃圾收集器自动释放。

      此方法是幂等的:在已经关闭的上下文中调用它没有任何效果。不允许在封闭的上下文中调用任何其他方法,这会导致未定义的行为。

      指定者:
      close 在接口 Context
      抛出:
      NamingException - 如果遇到命名异常
    • getNameInNamespace

      public String  getNameInNamespace() throws NamingException
      从接口 Context 复制的描述
      在其自己的命名空间中检索此上下文的全名。

      许多命名服务在各自的命名空间中都有一个对象的“全名”概念。例如,LDAP 条目具有专有名称,而 DNS 记录具有完全限定名称。此方法允许客户端应用程序检索此名称。此方法返回的字符串不是 JNDI 复合名称,不应直接传递给上下文方法。在全名概念没有意义的命名系统中,抛出OperationNotSupportedException

      指定者:
      getNameInNamespace 在接口 Context
      返回:
      此上下文在其自己的命名空间中的名称;永不为空
      抛出:
      OperationNotSupportedException - 如果命名系统没有全名的概念
      NamingException - 如果遇到命名异常