Module java.naming
Package javax.naming

Class 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_name的字符串)作为名称参数传递给任何方法时,会定位并使用处理该方案的URL上下文工厂来解析URL。如果找不到这样的工厂,则使用由"java.naming.factory.initial"指定的初始上下文。类似地,当将第一个组件为URL字符串的CompositeName对象作为名称参数传递给任何方法时,会定位并使用用于解析第一个名称组件的URL上下文工厂。请参阅NamingManager.getURLContext()以了解如何定位URL上下文工厂。

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

当无法实例化初始上下文时,会抛出NoInitialContextException。这个异常可能在与InitialContext的任何交互中抛出,不仅在构造InitialContext时。例如,初始上下文的实现可能在实际调用它的方法时才懒惰地检索上下文。应用程序不应该依赖于何时确定初始上下文的存在。

当环境属性"java.naming.factory.initial"非空时,InitialContext构造函数将尝试创建其中指定的初始上下文。在那时,如果遇到问题,初始上下文工厂可能会抛出异常。但是,当验证并指示初始上下文的使用者任何环境属性或连接相关问题时,这是提供程序实现相关的。它可以懒惰地这样做--延迟到在上下文上执行操作时,或者急切地,在构造上下文时。

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

自从:
1.3, JNDI 1.1
参见:
  • Field Details

  • Constructor Details

    • 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 - 如果遇到命名异常
  • Method Details

    • init

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

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

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

      public static <T> T doLookup(Name name) throws NamingException
      通过调用 NamingManager.getInitialContext()检索命名对象的静态方法,并将其缓存在defaultInitCtx中。设置gotDefault以便我们知道以前已尝试过这样做。
      类型参数:
      T - 返回对象的类型
      参数:
      name - 要查找的对象的名称
      返回:
      绑定到name的对象
      抛出:
      NamingException - 如果遇到命名异常
      自1.6起:
      1.6
      参见:
    • doLookup

      public static <T> T doLookup(String name) throws NamingException
      通过调用NamingManager.getInitialContext()检索命名对象的静态方法。这是等效于调用的快捷方法:

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

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

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

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

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

      有关子类如何使用此方法的描述,请参见getURLOrDefaultInitCtx(Name)。

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

      protected Context getURLOrDefaultInitCtx(Name name) throws NamingException
      为解析name检索上下文。如果name的第一个组件是URL字符串,则尝试为其查找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 - 要添加的环境属性的名称;不得为null
      propVal - 要添加的属性的值;不得为null
      返回:
      属性的先前值,如果属性之前不在环境中则为null
      抛出:
      NamingException - 如果遇到命名异常
      参见:
    • removeFromEnvironment

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

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

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

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

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

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

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

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

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

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