模块  java.naming
软件包  javax.naming.spi

Interface ObjectFactory

  • All Known Subinterfaces:
    DirObjectFactory

    public interface ObjectFactory
    此接口表示用于创建对象的工厂。

    JNDI框架允许通过对象工厂动态加载对象实现。 例如,当查找绑定在名称空间中的打印机时,如果打印服务将打印机名称绑定到引用,则可以使用打印机参考来创建打印机对象,以便查找的调用者可以在打印机对象之后直接操作查找。

    ObjectFactory负责创建特定类型的对象。 在上面的示例中,您可能有一个PrinterObjectFactory用于创建Printer对象。

    对象工厂必须实现ObjectFactory接口。 此外,工厂类必须是公共的,并且必须具有不接受任何参数的公共构造函数。 请注意,如果工厂位于命名模块中,则它必须位于由该模块导出到java.naming模块的包中。

    可以使用不同的参数多次调用对象工厂的getObjectInstance()方法。 该实现是线程安全的。

    在此类文档中提及URL是指RFC 1738及其相关RFC定义的URL字符串。 它是符合其中描述的语法的任何字符串,并且可能并不总是在java.net.URL类或Web浏览器中具有相应的支持。

    从以下版本开始:
    1.3
    另请参见:
    NamingManager.getObjectInstance(java.lang.Object, javax.naming.Name, javax.naming.Context, java.util.Hashtable<?, ?>)NamingManager.getURLContext(java.lang.String, java.util.Hashtable<?, ?>)ObjectFactoryBuilderStateFactory
    • 方法详细信息

      • getObjectInstance

        Object getObjectInstance​(Object obj,
                                 Name name,
                                 Context nameCtx,
                                 Hashtable<?,​?> environment)
                          throws 异常
        使用指定的位置或引用信息创建对象。

        使用environment提供此对象的特殊要求。 这种环境属性的一个例子是用户身份信息。

        NamingManager.getObjectInstance()在对象工厂中连续加载并对它们调用此方法,直到产生非空答案。 当对象工厂抛出异常时,异常将传递给调用者NamingManager.getObjectInstance() (并且不会搜索可能产生非空答案的其他工厂)。 如果对象工厂确定它是唯一的预期工厂并且不应该尝试其他对象工厂,则它应该只抛出异常。 如果此工厂无法使用提供的参数创建对象,则应返回null。

        URL上下文工厂是一个特殊的ObjectFactory,它创建用于解析URL或由URL指定位置的对象的上下文。 URL上下文工厂的getObjectInstance()方法将遵循以下规则。

        1. 如果obj为null,则创建用于解析与此工厂关联的方案的URL的上下文。 生成的上下文不依赖于特定的URL:它能够使用此工厂的方案ID处理任意URL。 例如,在LDAP URL上下文工厂中调用getObjectInstance()并将obj设置为null将返回可以解析LDAP URL的上下文,例如“ldap://ldap.wiz.com/o=wiz,c=us”和“ldap: //ldap.umich.edu/o=umich,c=us”。
        2. 如果obj是URL字符串,请创建由URL标识的对象(通常是上下文)。 例如,假设这是一个LDAP URL上下文工厂。 如果obj是“ldap://ldap.wiz.com/o=wiz,c=us”,则getObjectInstance()将返回LDAP服务器ldap上由专有名称“o = wiz,c = us”命名的上下文。 wiz.com。 然后,可以使用此上下文来解析相对于该上下文的LDAP名称(例如“cn = George”)。
        3. 如果obj是URL字符串数组,则假设URL在它们引用的上下文方面是等效的。 验证URL是否或必须是等效的是由上下文工厂决定的。 数组中URL的顺序并不重要。 getObjectInstance()返回的对象类似于单个URL情况。 它是URL命名的对象。
        4. 如果obj属于任何其他类型,则getObjectInstance()的行为由上下文工厂实现确定。

        nameenvironment参数归调用者所有。 实现不会修改这些对象或保留对它们的引用,尽管它可能会保留对克隆或副本的引用。

        名称和上下文参数。 namenameCtx参数可以选择用于指定要创建的对象的名称。 name是对象的名称,相对于上下文nameCtx 如果存在可以从中命名对象的几个可能的上下文 - 通常是这种情况 - 则由调用者选择一个。 一个好的经验法则是选择可用的“最深”的上下文。 如果nameCtx为空,则name相对于默认初始上下文。 如果未指定名称,则name参数应为null。 如果工厂使用nameCtx它应该将其使用与并发访问同步,因为上下文实现不保证是线程安全的。

        参数
        obj - 包含可用于创建对象的位置或引用信息的可能为null的对象。
        name - 此对象相对于 nameCtx的名称,如果未指定名称,则为null。
        nameCtx - 指定 name参数的上下文,如果 name相对于默认初始上下文,则 name null。
        environment - 用于创建对象的可能为null的环境。
        结果
        创建的对象; 如果无法创建对象,则返回null。
        异常
        异常 - 如果此对象工厂在尝试创建对象时遇到异常,并且不尝试其他对象工厂。
        另请参见:
        NamingManager.getObjectInstance(java.lang.Object, javax.naming.Name, javax.naming.Context, java.util.Hashtable<?, ?>), NamingManager.getURLContext(java.lang.String, java.util.Hashtable<?, ?>)