public interface StateFactory
此接口表示一个工厂,该工厂用来获得用于绑定的对象状态。
JNDI 框架允许通过对象工厂 动态加载对象实现。例如,当查找绑定在名称空间中的打印机时,如果打印服务将打印机的名称绑定到 Reference,则可以使用该打印机 Reference 创建一个打印机对象,从而查找的调用者可以在查找后直接在该打印机对象上操作。
ObjectFactory 负责创建特定类型的对象。在上述示例中,可以有一个用来创建 Printer 对象的 PrinterObjectFactory。
对于相反过程,当将对象绑定到名称空间中时,JNDI 将提供状态工厂。继续打印机的示例,假设打印机对象被更新和重新绑定:
用于 ctx 的服务提供者使用一个状态工厂来获得绑定到其名称空间的 printer 的状态。用于 Printer 类型对象的状态工厂可能返回一个用来存储在命名系统中的更紧凑的对象。ctx.rebind("inky", printer);
状态工厂必须实现 StateFactory 接口。此外,工厂类必须是公共的,必须有一个不接受任何参数的公共构造方法。
可以使用不同的参数多次调用状态工厂的 getStateToBind() 方法。该实现是线程安全的。
StateFactory 与只实现 Context 接口的服务提供者一起使用。DirStateFactory 与实现 DirContext 接口的服务提供者一起使用。
NamingManager.getStateToBind(java.lang.Object, javax.naming.Name, javax.naming.Context, java.util.Hashtable
)
,
DirectoryManager.getStateToBind(java.lang.Object, javax.naming.Name, javax.naming.Context, java.util.Hashtable
, javax.naming.directory.Attributes)
,
ObjectFactory
,
DirStateFactory
方法摘要 | |
---|---|
Object |
getStateToBind(Object obj, Name name, Context nameCtx, Hashtable<?,?> environment) 检索用于绑定的对象状态。 |
方法详细信息 |
---|
Object getStateToBind(Object obj, Name name, Context nameCtx, Hashtable<?,?> environment) throws NamingException
NamingManager.getStateToBind() 接连在状态工厂中加载,并在这些工厂上调用此方法,直到某一工厂产生非 null 应答。DirectoryManager.getStateToBind() 接连在状态工厂中加载。如果某一工厂实现 DirStateFactory,则 DirectoryManager 调用 DirStateFactory.getStateToBind();否则它调用 StateFactory.getStateToBind()。
当某一工厂抛出异常时,该异常被传递给 NamingManager.getStateToBind() 和 DirectoryManager.getStateToBind() 的调用者。停止搜索可能产生非 null 应答的其他工厂。工厂只有在可以确定它是唯一需要的工厂并且不应该再尝试其他工厂时才抛出异常。如果此对象工厂无法使用所提供的参数创建对象,则它应该返回 null。
可以有选择地使用 name
和 nameCtx
参数来指定要创建的对象的名称。有关详细信息,请参阅 ObjectFactory.getObjectInstance()
中“名称和上下文参数”的描述。如果某一工厂使用 nameCtx
,则它应该将其使用与并发访问同步,因为无法保证上下文实现是线程安全的。
name 和 environment 参数都归调用者所有。该实现不会修改这些对象或保存对它们的引用,尽管它可能保存对这些对象的副本的引用。
obj
- 将检索其状态的非 null 对象。
name
- 此对象相对于
nameCtx
的名称,如果没有指定名称,则该参数为 null。
nameCtx
- 一个上下文,
name
参数是相对于该上下文指定的,如果
name
相对于默认初始上下文,则该参数为 null。
environment
- 将在创建对象的状态时使用的环境(可能为 null)。
NamingException
- 如果此工厂在试图获得对象的状态时遇到异常,并且不再尝试其他工厂。
NamingManager.getStateToBind(java.lang.Object, javax.naming.Name, javax.naming.Context, java.util.Hashtable
)
,
DirectoryManager.getStateToBind(java.lang.Object, javax.naming.Name, javax.naming.Context, java.util.Hashtable
, javax.naming.directory.Attributes)