public interface ObjectFactory
此类表示用于创建对象的工厂。
JNDI 框架允许通过对象工厂 动态加载对象实现。例如,当查找绑定在名称空间中的打印机时,如果打印服务将打印机的名称绑定到 Reference,则可以使用该打印机 Reference 创建一个打印机对象,从而查找的调用者可以在查找后直接在该打印机对象上操作。
ObjectFactory 负责创建特定类型的对象。在上述示例中,可以有一个用来创建 Printer 对象的 PrinterObjectFactory。
对象工厂必须实现 ObjectFactory 接口。此外,工厂类必须是公共的,必须有一个不接受任何参数的公共构造方法。
可以使用不同的参数多次调用对象工厂的 getObjectInstance() 方法。该实现是线程安全的。
用于此类文档中的 URL 是指通过 RFC 1738 及其相关的 RFC 定义的 URL 字符串。它是符合其中所述语法的任何字符串,在 java.net.URL 类或 Web 浏览器中未必总能获得相应的支持。
NamingManager.getObjectInstance(java.lang.Object, javax.naming.Name, javax.naming.Context, java.util.Hashtable
)
,
NamingManager.getURLContext(java.lang.String, java.util.Hashtable
)
,
ObjectFactoryBuilder
,
StateFactory
方法摘要 | |
---|---|
Object |
getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?,?> environment) 使用指定的位置或引用信息创建一个对象。 |
方法详细信息 |
---|
Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?,?> environment) throws Exception
使用 environment
提供此对象的特殊需要。这种 environment 属性的一个示例是用户身份信息。
NamingManager.getObjectInstance() 接连在对象工厂中加载,并在这些工厂上调用此方法,直到某一工厂产生非 null 应答。当对象工厂抛出异常时,该异常被传递给 NamingManager.getObjectInstance() 的调用者(并且不再搜索可能产生非 null 应答的其他工厂)。对象工厂只有在可以确定它是唯一需要的工厂并且不应该再尝试其他对象工厂时才抛出异常。如果此对象工厂无法使用所提供的参数创建对象,则它应该返回 null。
URL 上下文工厂 是一个特殊的 ObjectFactory,它创建用于解析 URL 或位置由 URL 指定的对象的上下文。URL 上下文工厂的 getObjectInstance() 方法将遵守以下规则。
obj
为 null,则创建一个上下文,该上下文用于解析与此工厂关联的方案的 URL。得到的上下文没有绑定到特定 URL:它能够使用此工厂的方案 id 处理任意 URL。例如,在 LDAP URL 上下文工厂上调用将 obj
设置为 null 的 getObjectInstance() 将返回一个可以解析 LDAP URL(比如 "ldap://ldap.wiz.com/o=wiz,c=us" 和 "ldap://ldap.umich.edu/o=umich,c=us")的上下文。 obj
是一个 URL 字符串,则创建由该 URL 标识的对象(通常是一个上下文)。例如,假设这是一个 LDAP URL 上下文工厂。如果 obj
是 "ldap://ldap.wiz.com/o=wiz,c=us",则 getObjectInstance() 将返回由 LDAP 服务器 ldap.wiz.com 上的标识名 "o=wiz, c=us" 指定的上下文。然后可以使用此上下文解析相对于该上下文的 LDAP 名称(比如 "cn=George")。 obj
是一个 URL 字符串数组,则根据它们所引用的上下文假定这些 URL 相等。验证这些 URL 是否相等或是否需要相等取决于上下文工厂。数组中 URL 的顺序无关紧要。由 getObjectInstance() 返回的对象类似于单个 URL 的情况下返回的对象。该对象是由 URL 指定的对象。 obj
属于其他任何类型,则 getObjectInstance() 的行为由上下文工厂实现确定。 name 和 environment 参数都归调用者所有。该实现不会修改这些对象或保存对它们的引用,尽管它可能保存对这些对象的副本的引用。
名称和上下文参数。 可以有选择地使用 name
和 nameCtx
参数来指定将创建的对象的名称。name
是该对象相对于上下文 nameCtx
的名称。如果有几个可以从中指定对象的可能上下文(通常会是这种情况),则由调用者决定选择哪一个。根据经验,应选择“最深的”可用上下文。如果 nameCtx
为 null,则 name
相对于默认初始上下文。如果没有名称将被指定,则 name
参数应该为 null。如果某一工厂使用 nameCtx
,则它应该将其使用与并发访问同步,因为无法保证上下文实现是线程安全的。
obj
- 包含可在创建对象时使用的位置或引用信息的对象(可能为 null)。
name
- 此对象相对于
nameCtx
的名称,如果没有指定名称,则该参数为 null。
nameCtx
- 一个上下文,
name
参数是相对于该上下文指定的,如果
name
相对于默认初始上下文,则该参数为 null。
environment
- 创建对象时使用的环境(可能为 null)。
Exception
- 如果此对象工厂在试图创建对象时遇到异常,并且不再尝试其他对象工厂。
NamingManager.getObjectInstance(java.lang.Object, javax.naming.Name, javax.naming.Context, java.util.Hashtable
)
,
NamingManager.getURLContext(java.lang.String, java.util.Hashtable
)