我正在使用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作为接口?
答案 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,但搜索失败。