Spring的ObjectFactoryCreatingFactoryBean可以使用引用接口的泛型吗?

时间:2010-10-22 19:06:36

标签: java spring

我正在使用Spring的ObjectFactoryCreatingFactoryBean来检索原型范围的bean,如Spring Documentation中所述。下面是我的applicationContext。

<bean id="exportFactory" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean">
    <property name="targetBeanName">
        <idref local="export" />
    </property>
</bean>

<bean id="export" class="com.someorg.ExportImpl" scope="prototype"/>

我将 exportFactory 自动装入类似的类:

@Autowired
@Qualifier("exportFactory")
private ObjectFactory<?> exportFactory;

这可以按预期工作。每次调用 exportFactory.getObject()方法都会返回一个新的 ExportImpl 。在进一步检查时,对getObject()的调用实际上返回以下实例: org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean $ TargetBeanObjectFactory

现在, ExportImpl Export 接口的实现。当我尝试使用泛型声明 exportFactory 时,如下所述,我得到一个例外。

@Autowired
@Qualifier("exportFactory")
private ObjectFactory<Export> exportFactory;

堆栈跟踪:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.someorg.Export] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=exportFactory)}

使用此配置成功加载应用程序上下文,并在调用 exportFactory.getObject()时抛出异常。使用相同的配置,我可以成功检索ExportImpl的实例,因此我知道bean已正确连接。

我想知道a)Spring在这里做了什么,b)是否有一个原因我无法使用带参数的ObjectFactory作为接口?

2 个答案:

答案 0 :(得分:1)

将限定符更改为:

@Qualifier("export")

答案 1 :(得分:1)

事实证明,当您通过ObjectFactoryCreatingFactoryBean获取ObjectFactory时,@Autowired不是必需的。在这种情况下,您的bean的ObjectFactory是自动创建的,但我在文档中找不到任何对此行为的引用。

因此,您观察到的行为可以解释如下:

  • 当你编写@Autowired @Qualifier("exportFactory") ObjectFactory<?>时,Spring创建ObjectFactory,返回一个名为exportFactory的bean,它本身是ObjectFactory返回的ObjectFactoryCreatingFactoryBean (它的类是org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean$TargetBeanObjectFactory)。

  • 当您编写@Autowired @Qualifier("exportFactory") ObjectFactory<Export>时,Spring会尝试查找名为Export的{​​{1}}类型的bean,但搜索失败。