Java Can弹簧&x27;s ObjectFactoryCreatingFactoryBean是否与引用接口的泛型一起工作?
我正在使用Spring的ObjectFactoryCreatingFactoryBean检索一个原型范围的bean,如中所述。下面是我的应用程序上下文Java Can弹簧&x27;s ObjectFactoryCreatingFactoryBean是否与引用接口的泛型一起工作?,java,spring,Java,Spring,我正在使用Spring的ObjectFactoryCreatingFactoryBean检索一个原型范围的bean,如中所述。下面是我的应用程序上下文 <bean id="exportFactory" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean"> <property name="targetBeanName"> <idref
<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.getObject()时引发异常。使用相同的配置,我可以成功地检索ExportImpl的一个实例,因此我知道bean是正确连接的
我想知道a)Spring在这里做什么,b)有什么原因使我无法使用作为接口的类型参数的ObjectFactory吗?将限定符更改为:
@Qualifier("export")
当您通过
@Autowired
获取ObjectFactory
时,实际上不需要ObjectFactoryCreatingFactoryBean
。在这种情况下,bean的ObjectFactory
是自动创建的,尽管我在文档中找不到任何关于这种行为的参考
因此,您观察到的行为可以解释如下:
- 编写
时,Spring创建@Autowired@Qualifier(“exportFactory”)ObjectFactory
,返回名为ObjectFactory
的bean,该bean本身是exportFactory
返回的ObjectFactoryCreatingFactoryBean
(它的类是ObjectFactory
)org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean$TargetBeanObjectFactory
- 当您编写
时,Spring尝试查找名为@Autowired@Qualifier(“exportFactory”)ObjectFactory
的exportFactory
类型的bean,搜索失败Export
限定符(value=exportFactory)}
@Bozho,在发布到SO之前,我正在复制并粘贴到记事本中。我更改了xml和stacktrace中的值,但忘记了限定符。@unsquared-好的,我使用正确的限定符。因此,请仔细检查您是否有正确的限定符,并给出相应的异常message@Bozho你说得对,斯图pid错误。我接受了axtavt的答案,因为这不会帮助任何比我少脑死亡的人,并且会处理一个有趣的Spring功能。这可以解释为什么我调用exportFactory().getObject()正在返回ObjectFactoryCreatingFactoryBean$TargetBeanObjectFactory的实例,该实例在强制转换时将返回预期的ExportImpl。有趣的是,我在运行spring-3.0.2时使用了spring-context-2.5.xsd和spring-beans-2.5.xsd。我将架构位置更改为3.0,问题就消失了。是的,进行了注释使用id=“exportFactory”输出bean也完成了。谢谢。@axtavt-如果您使用Bozho描述的@Qualifier,您可以保留@Autowired,Spring实际上会返回预期的bean。@unsquared:是的,因为在这种情况下Spring会查找名为Export
的类型的bean,并成功地找到它,忽略不必要的exportfact>ry
。
@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)}
@Qualifier("export")