public interface StateFactory
JNDI框架允许通过对象工厂动态加载对象实现 。 例如,当查找名称空间中绑定的打印机时,如果打印服务将打印机名称绑定到Reference s,打印机Reference可用于创建打印机对象,以便查找的调用者可以直接在打印机对象上操作查找后。
一个ObjectFactory负责创建特定类型的对象。 在上面的例子中,您可能有一个PrinterObjectFactory用于创建Printer对象。
对于相反的过程,当对象绑定到命名空间中时,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) throws NamingException
NamingManager.getStateToBind()在状态工厂中连续加载,并在其上调用此方法,直到产生非空答案。 DirectoryManager.getStateToBind()在国家工厂连续装载。 如果工厂实行DirStateFactory ,则DirectoryManager调用DirStateFactory.getStateToBind() ; 否则调用StateFactory.getStateToBind() 。
当工厂抛出异常时,异常传递给NamingManager.getStateToBind()和DirectoryManager.getStateToBind()的调用者。 搜索可能产生非空答案的其他工厂停止。 如果确定它是唯一的预定工厂,并且没有其他工厂应该被尝试,工厂只应该抛出异常。 如果此工厂无法使用提供的参数创建对象,则应返回null。
name
和nameCtx
参数可以可选地用于指定正在创建的对象的名称。 见“名称和上下文参数”的描述ObjectFactory.getObjectInstance()
了解详情。 如果一个工厂使用nameCtx
它应该将它的使用与并发访问同步,因为上下文实现不能保证是线程安全的。
name和environment参数由呼叫者拥有。 尽管它可能会保留对克隆或副本的引用,但实现不会修改这些对象或保留对它们的引用。
obj
- 要检索其状态的非空对象。
name
- 相对于
nameCtx
的此对象的名称,如果未指定名称,则为null。
nameCtx
- 指定
name
参数的上下文,如果
name
相对于默认的初始上下文,则为null。
environment
- 用于创建对象状态的可能的空环境。
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)