public class InitialContext extends Object implements Context
所有命名操作都与上下文相关。 初始上下文实现了Context接口,并提供了解析名称的起点。
当构建初始上下文时,将使用传递给构造函数的环境参数中定义的属性和任何application resource files对其环境进行初始化 。 另外,少量的标准JNDI属性可以被指定为系统属性或applet参数(通过使用Context.APPLET
)。 这些特殊属性列在Context和LdapContext接口文档的字段详细信息部分。
JNDI通过合并来自以下两个来源的值来确定每个属性的值:
初始上下文实现在运行时确定。 默认策略使用环境属性“ java.naming.factory.initial
”,其中包含初始上下文工厂的类名。 解决URL字符串时会出现此策略的一个例外,如下所述。
当一个URL字符串(形式一个scheme_id的String:rest_of_name)作为名称参数传递给任何方法,一个URL上下文工厂处理该方案的定位和用于解析URL。 如果没有找到这样的工厂,则使用由"java.naming.factory.initial"指定的初始上下文。 类似地,当第一个组件是URL字符串的CompositeName对象作为name参数传递给任何方法时,将定位一个URL上下文工厂,并用于解析名字组件。 有关URL上下文工厂位置的描述,请参阅NamingManager.getURLContext()
。
定位初始上下文和URL上下文工厂的默认策略可以通过调用NamingManager.setInitialContextFactoryBuilder()来覆盖 。
当初始上下文无法实例化时抛出NoInitialContextException。 在与InitialContext的任何交互期间都可以抛出此异常,不仅在构建InitialContext时。 例如,初始上下文的实现可能只有在实际方法被调用时才可能懒惰地检索上下文。 应用程序不应该依赖于何时确定初始上下文的存在。
当环境属性“java.naming.factory.initial”不为空时,InitialContext构造函数将尝试创建其中指定的初始上下文。 那时候,如果遇到问题,最初的上下文工厂可能会引发异常。 然而,它是提供者实现相关的,当它验证并向初始上下文的用户指示任何环境属性或连接相关的问题。 它可以懒惰地进行延迟,直到在上下文中执行操作,或者在构建上下文时急切地。
InitialContext实例与多线程的并发访问不同步。 每个处理不同InitialContext实例的多个线程不需要同步。 需要同时访问单个InitialContext实例的线程应在其间同步并提供必要的锁定。
Context
, NamingManager.setInitialContextFactoryBuilder
Modifier and Type | Field and Description |
---|---|
protected Context |
defaultInitCtx
保留调用NamingManager.getInitialContext()的结果的字段。
|
protected boolean |
gotDefault
指示是否通过调用NamingManager.getInitialContext()获取初始上下文的字段。
|
protected Hashtable<Object,Object> |
myProps
与此InitialContext关联的环境。
|
APPLET, AUTHORITATIVE, BATCHSIZE, DNS_URL, INITIAL_CONTEXT_FACTORY, LANGUAGE, OBJECT_FACTORIES, PROVIDER_URL, REFERRAL, SECURITY_AUTHENTICATION, SECURITY_CREDENTIALS, SECURITY_PRINCIPAL, SECURITY_PROTOCOL, STATE_FACTORIES, URL_PKG_PREFIXES
Modifier | Constructor and Description |
---|---|
|
InitialContext()
构建一个初始上下文。
|
protected |
InitialContext(boolean lazy)
构造一个初始上下文,并选择不初始化它。
|
|
InitialContext(Hashtable<?,?> environment)
使用提供的环境构建初始上下文。
|
Modifier and Type | Method and Description |
---|---|
Object |
addToEnvironment(String propName, Object propVal)
在此上下文的环境中添加一个新的环境属性。
|
void |
bind(Name name, Object obj)
将名称绑定到对象。
|
void |
bind(String name, Object obj)
将名称绑定到对象。
|
void |
close()
关闭这个上下文。
|
Name |
composeName(Name name, Name prefix)
使用相对于该上下文的名称组合此上下文的名称。
|
String |
composeName(String name, String prefix)
使用相对于该上下文的名称组合此上下文的名称。
|
Context |
createSubcontext(Name name)
创建并绑定新的上下文。
|
Context |
createSubcontext(String name)
创建并绑定新的上下文。
|
void |
destroySubcontext(Name name)
销毁命名上下文并将其从命名空间中删除。
|
void |
destroySubcontext(String name)
销毁命名上下文并将其从命名空间中删除。
|
static <T> T |
doLookup(Name name)
一种用于检索命名对象的静态方法。
|
static <T> T |
doLookup(String name)
一种用于检索命名对象的静态方法。
|
protected Context |
getDefaultInitCtx()
通过调用
NamingManager.getInitialContext() 初始上下文并将其缓存在defaultInitCtx中。
|
Hashtable<?,?> |
getEnvironment()
检索此环境有效的环境。
|
String |
getNameInNamespace()
在其自己的命名空间中检索此上下文的全名。
|
NameParser |
getNameParser(Name name)
检索与命名上下文关联的解析器。
|
NameParser |
getNameParser(String name)
检索与命名上下文关联的解析器。
|
protected Context |
getURLOrDefaultInitCtx(Name name)
检索用来解析上下文
name 。
|
protected Context |
getURLOrDefaultInitCtx(String name)
检索用于解析字符串名称
name 。
|
protected void |
init(Hashtable<?,?> environment)
使用提供的环境初始化初始上下文。
|
NamingEnumeration<NameClassPair> |
list(Name name)
枚举在命名上下文中绑定的名称以及绑定到它们的对象的类名。
|
NamingEnumeration<NameClassPair> |
list(String name)
枚举在命名上下文中绑定的名称以及绑定到它们的对象的类名。
|
NamingEnumeration<Binding> |
listBindings(Name name)
枚举在命名上下文中绑定的名称以及绑定到它们的对象。
|
NamingEnumeration<Binding> |
listBindings(String name)
枚举在命名上下文中绑定的名称以及绑定到它们的对象。
|
Object |
lookup(Name name)
检索命名对象。
|
Object |
lookup(String name)
检索命名对象。
|
Object |
lookupLink(Name name)
检索命名对象,除了名称的终端原子组件以外的链接。
|
Object |
lookupLink(String name)
检索命名对象,除了名称的终端原子组件以外的链接。
|
void |
rebind(Name name, Object obj)
将名称绑定到对象,覆盖任何现有绑定。
|
void |
rebind(String name, Object obj)
将名称绑定到对象,覆盖任何现有绑定。
|
Object |
removeFromEnvironment(String propName)
从环境环境中删除环境属性。
|
void |
rename(Name oldName, Name newName)
将绑定到旧名称的对象绑定一个新名称,并取消绑定旧名称。
|
void |
rename(String oldName, String newName)
将绑定到旧名称的对象绑定一个新名称,并取消绑定旧名称。
|
void |
unbind(Name name)
取消绑定命名对象。
|
void |
unbind(String name)
取消绑定命名对象。
|
protected Hashtable<Object,Object> myProps
protected Context defaultInitCtx
getDefaultInitCtx()
protected boolean gotDefault
defaultInitCtx
。
protected InitialContext(boolean lazy) throws NamingException
lazy
- 真正的手段不初始化初始上下文;
false相当于调用new InitialContext()
NamingException
- 如果遇到命名异常
init(Hashtable)
public InitialContext() throws NamingException
NamingException
- 如果遇到命名异常
InitialContext(Hashtable)
public InitialContext(Hashtable<?,?> environment) throws NamingException
此构造函数不会修改environment或保存对它的引用,但可以保存克隆。 在environment传递给构造函数后,调用者不应修改可变键和值。
environment
- 用于创建初始上下文的环境。
空指示空的环境。
NamingException
- 如果遇到命名异常
protected void init(Hashtable<?,?> environment) throws NamingException
此方法将修改environment并保存其引用。 来电者可能不再修改它。
environment
- 用于创建初始上下文的环境。
空指示空的环境。
NamingException
- 如果遇到命名异常
InitialContext(boolean)
public static <T> T doLookup(Name name) throws NamingException
InitialContext ic = new InitialContext(); Object obj = ic.lookup();
如果name为空,则返回此上下文的新实例(其表示与该上下文相同的命名上下文,但其环境可以独立修改,并且可以并发访问)。
T
- 返回对象的类型
name
- 要查找的对象的名称
NamingException
- 如果遇到命名异常
doLookup(String)
,
lookup(Name)
public static <T> T doLookup(String name) throws NamingException
doLookup(Name)
。
T
- 返回对象的类型
name
- 要查找的对象的名称
NamingException
- 如果遇到命名异常
protected Context getDefaultInitCtx() throws NamingException
NamingManager.getInitialContext()
并将其缓存在defaultInitCtx中获取初始上下文。
设置gotDefault
,以便我们知道我们以前尝试过。
NoInitialContextException
- 如果找不到初始上下文。
NamingException
- 如果遇到命名异常。
protected Context getURLOrDefaultInitCtx(String name) throws NamingException
name
。
如果name
名称是URL字符串,则尝试为其找到URL上下文。
如果没有找到,或者如果name
不是URL字符串,则返回getDefaultInitCtx()
。
有关子类应如何使用此方法的说明,请参阅getURLOrDefaultInitCtx(Name)。
name
- 获取上下文的非空名称。
name
的URL上下文或缓存的初始上下文。
结果不能为空。
NoInitialContextException
- 如果找不到初始上下文。
NamingException
- 遇到命名异常。
NamingManager.getURLContext(java.lang.String, java.util.Hashtable<?, ?>)
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
- 遇到命名异常。
NamingManager.getURLContext(java.lang.String, java.util.Hashtable<?, ?>)
public Object lookup(String name) throws NamingException
Context
复制
Context.lookup(Name)
。
lookup
在接口
Context
name
- 要查找的对象的名称
NamingException
- 如果遇到命名异常
public Object lookup(Name name) throws NamingException
Context
复制
lookup
在界面
Context
name
- 要查找的对象的名称
NamingException
- 如果遇到命名异常
Context.lookup(String)
,
Context.lookupLink(Name)
public void bind(String name, Object obj) throws NamingException
Context
复制
Context.bind(Name, Object)
。
bind
在界面
Context
name
- 要绑定的名称
可能不是空的
obj
- 要绑定的对象;
可能为null
NameAlreadyBoundException
- 如果名称已经绑定
InvalidAttributesException
- 如果对象没有提供所有必需属性
NamingException
- 如果遇到一个命名异常
public void bind(Name name, Object obj) throws NamingException
Context
复制
bind
在界面
Context
name
- 要绑定的名称
可能不是空的
obj
- 要绑定的对象;
可能为null
NameAlreadyBoundException
- 如果名称已经绑定
InvalidAttributesException
- 如果对象没有提供所有必需属性
NamingException
- 如果遇到命名异常
Context.bind(String, Object)
,
Context.rebind(Name, Object)
,
DirContext.bind(Name, Object, javax.naming.directory.Attributes)
public void rebind(String name, Object obj) throws NamingException
Context
复制
Context.rebind(Name, Object)
。
rebind
在界面
Context
name
- 要绑定的名称
可能不是空的
obj
- 要绑定的对象;
可能为null
InvalidAttributesException
- 如果对象没有提供所有必需属性
NamingException
- 如果遇到命名异常
public void rebind(Name name, Object obj) throws NamingException
Context
复制
如果对象是DirContext ,与该名称相关联的任何现有属性都将替换为对象的属性。 否则,与名称关联的任何现有属性都保持不变。
rebind
在界面
Context
name
- 要绑定的名称
可能不是空的
obj
- 要绑定的对象;
可能为null
InvalidAttributesException
- 如果对象没有提供所有必需属性
NamingException
- 如果遇到命名异常
Context.rebind(String, Object)
, Context.bind(Name, Object)
, DirContext.rebind(Name, Object, javax.naming.directory.Attributes)
, DirContext
public void unbind(String name) throws NamingException
Context
复制
Context.unbind(Name)
。
unbind
在界面
Context
name
- 取消绑定的名称
可能不是空的
NameNotFoundException
- 如果中间上下文不存在
NamingException
- 如果遇到命名异常
public void unbind(Name name) throws NamingException
Context
复制
name
中的终端原子名称, name
的终端原子部分name
。
这种方法是幂等的。 即使终端原子名称未绑定在目标上下文中也可以成功,但如果任何中间上下文不存在,则抛出NameNotFoundException 。
与名称相关联的任何属性都将被删除。 中间上下文不变。
unbind
在接口
Context
name
- 取消绑定的名称
可能不是空的
NameNotFoundException
- 如果中间上下文不存在
NamingException
- 如果遇到命名异常
Context.unbind(String)
public void rename(String oldName, String newName) throws NamingException
Context
复制
Context.rename(Name, Name)
。
rename
在接口
Context
oldName
- 现有绑定的名称;
可能不是空的
newName
- 新绑定的名称;
可能不是空的
NameAlreadyBoundException
- 如果
newName已经绑定
NamingException
- 如果遇到命名异常
public void rename(Name oldName, Name newName) throws NamingException
Context
复制
rename
在界面
Context
oldName
- 现有绑定的名称;
可能不是空的
newName
- 新绑定的名称;
可能不是空的
NameAlreadyBoundException
- 如果
newName已经绑定
NamingException
- 如果遇到命名异常
Context.rename(String, String)
,
Context.bind(Name, Object)
,
Context.rebind(Name, Object)
public NamingEnumeration<NameClassPair> list(String name) throws NamingException
Context
复制
Context.list(Name)
。
list
在界面
Context
name
- 要列出的上下文的名称
NamingException
- 如果遇到命名异常
public NamingEnumeration<NameClassPair> list(Name name) throws NamingException
Context
复制
如果将绑定添加到此上下文或从此上下文中删除,则其对先前返回的枚举的影响是未定义的。
list
在接口
Context
name
- 要列出的上下文的名称
NamingException
- 如果遇到命名异常
Context.list(String)
, Context.listBindings(Name)
, NameClassPair
public NamingEnumeration<Binding> listBindings(String name) throws NamingException
Context
复制
Context.listBindings(Name)
。
listBindings
在界面
Context
name
- 要列出的上下文的名称
NamingException
- 如果遇到命名异常
public NamingEnumeration<Binding> listBindings(Name name) throws NamingException
Context
复制
如果将绑定添加到此上下文或从此上下文中删除,则其对先前返回的枚举的影响是未定义的。
listBindings
在界面
Context
name
- 要列出的上下文的名称
NamingException
- 如果遇到命名异常
Context.listBindings(String)
, Context.list(Name)
, Binding
public void destroySubcontext(String name) throws NamingException
Context
复制
Context.destroySubcontext(Name)
。
destroySubcontext
在接口
Context
name
- 要销毁的上下文的名称;
可能不是空的
NameNotFoundException
- 如果中间上下文不存在
NotContextException
- 如果名称是绑定但不指定上下文,或者不指定适当类型的上下文
ContextNotEmptyException
- 如果命名上下文不为空
NamingException
- 如果遇到命名异常
public void destroySubcontext(Name name) throws NamingException
Context
复制
这种方法是幂等的。 即使终端原子名称未绑定到目标上下文中也可以成功,但如果任何中间上下文不存在,则抛出NameNotFoundException 。
在联合命名系统中,来自一个命名系统的上下文可能绑定到另一个命名系统中的名称。 随后可以使用复合名称查找并执行对外部上下文的操作。 然而,企图破坏使用此复合名称将失败,并NotContextException的情况下,因为外部上下文不是在它所在的上下文的“子上下文”。 而是使用unbind()来删除外部上下文的绑定。 销毁外部上下文要求destroySubcontext()被从外部上下文的“本机”命名系统的上下文进行。
destroySubcontext
在接口
Context
name
- 要销毁的上下文的名称;
可能不是空的
NameNotFoundException
- 如果中间上下文不存在
NotContextException
- 如果名称是绑定的,但不指定上下文,或者不指定适当类型的上下文
ContextNotEmptyException
- 如果命名上下文不为空
NamingException
- 如果遇到命名异常
Context.destroySubcontext(String)
public Context createSubcontext(String name) throws NamingException
Context
复制
Context.createSubcontext(Name)
。
createSubcontext
在界面
Context
name
- 要创建的上下文的名称;
可能不是空的
NameAlreadyBoundException
- 如果名称已经绑定
InvalidAttributesException
- 如果
InvalidAttributesException
创建需要规定强制属性
NamingException
- 如果遇到命名异常
public Context createSubcontext(Name name) throws NamingException
Context
复制
createSubcontext
在界面
Context
name
- 要创建的上下文的名称;
可能不是空的
NameAlreadyBoundException
- 如果名称已经绑定
InvalidAttributesException
- 如果
InvalidAttributesException
创建需要规定强制属性
NamingException
- 如果遇到命名异常
Context.createSubcontext(String)
,
DirContext.createSubcontext(javax.naming.Name, javax.naming.directory.Attributes)
public Object lookupLink(String name) throws NamingException
Context
复制
Context.lookupLink(Name)
。
lookupLink
在界面
Context
name
- 要查找的对象的名称
NamingException
- 如果遇到命名异常
public Object lookupLink(Name name) throws NamingException
Context
复制
lookupLink
在界面
Context
name
- 要查找的对象的名称
NamingException
- 如果遇到命名异常
Context.lookupLink(String)
public NameParser getNameParser(String name) throws NamingException
Context
复制
Context.getNameParser(Name)
。
getNameParser
在界面
Context
name
- 从中获取解析器的上下文的名称
NamingException
- 如果遇到命名异常
public NameParser getNameParser(Name name) throws NamingException
Context
复制
getNameParser
在接口
Context
name
- 从中获取解析器的上下文的名称
NamingException
- 如果遇到命名异常
Context.getNameParser(String)
, CompoundName
public String composeName(String name, String prefix) throws NamingException
composeName
在界面
Context
name
- 相对于此上下文的名称
prefix
- 此上下文相对于其祖先之一的名称
prefix
和
name
NamingException
- 如果遇到命名异常
public Name composeName(Name name, Name prefix) throws NamingException
composeName
在接口
Context
name
- 相对于此上下文的名称
prefix
- 此上下文相对于其祖先之一的名称
prefix
和
name
NamingException
- 如果遇到命名异常
Context.composeName(String, String)
public Object addToEnvironment(String propName, Object propVal) throws NamingException
Context
复制
addToEnvironment
在界面
Context
propName
- 要添加的环境属性的名称;
可能不为空
propVal
- 要添加的属性的值;
可能不为空
NamingException
- 如果遇到命名异常
Context.getEnvironment()
,
Context.removeFromEnvironment(String)
public Object removeFromEnvironment(String propName) throws NamingException
Context
复制
removeFromEnvironment
在界面
Context
propName
- 要删除的环境属性的名称;
可能不为空
NamingException
- 如果遇到命名异常
Context.getEnvironment()
,
Context.addToEnvironment(String, Object)
public Hashtable<?,?> getEnvironment() throws NamingException
Context
复制
调用者不应该对返回的对象进行任何更改:它们对上下文的影响是未定义的。 可以使用addToEnvironment()和removeFromEnvironment()更改此上下文的环境。
getEnvironment
在接口
Context
NamingException
- 如果遇到命名异常
Context.addToEnvironment(String, Object)
,
Context.removeFromEnvironment(String)
public void close() throws NamingException
Context
复制
该方法是幂等的:在已经关闭的上下文中调用它没有任何效果。 不允许在封闭上下文中调用任何其他方法,并导致未定义的行为。
close
在界面
Context
NamingException
- 如果遇到命名异常
public String getNameInNamespace() throws NamingException
Context
复制
许多命名服务对于各自的命名空间中的对象都有一个“全名”概念。 例如,LDAP条目具有可分辨名称,DNS记录具有完全限定名称。 此方法允许客户端应用程序检索此名称。 此方法返回的字符串不是JNDI组合名称,不应直接传递给上下文方法。 在命名系统中,全名概念没有意义, OperationNotSupportedException被抛出。
getNameInNamespace
在界面
Context
OperationNotSupportedException
- 如果命名系统没有全名的概念
NamingException
- 如果遇到命名异常