我正在使用 Spring 的 ObjectFactoryCreatingFactoryBean 来检索原型(prototype)作用域 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 Autowiring 到类中,如下所示:
@Autowired
@Qualifier("exportFactory")
private ObjectFactory<?> exportFactory;
这按预期工作。每次调用 exportFactory.getObject() 方法都会返回一个新的 ExportImpl。进一步检查,对 getObject() 的调用实际上返回以下实例:org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean$TargetBeanObjectFactory
现在,ExportImpl 是一个Export 接口(interface)的实现。当我尝试使用泛型声明 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) 我无法使用带有作为接口(interface)的类型参数的 ObjectFactory 有什么原因吗?
最佳答案
事实证明ObjectFactoryCreatingFactoryBean
当您获得 ObjectFactory
时不需要通过@Autowired
.在这种情况下 ObjectFactory
因为你的 bean 是自动创建的,尽管我在文档中找不到任何关于这种行为的引用。
因此,您观察到的行为可以解释如下:
当你写
@Autowired @Qualifier("exportFactory") ObjectFactory<?>
, Spring 创建ObjectFactory
返回一个名为exportFactory
的 bean ,它本身就是一个ObjectFactory
由ObjectFactoryCreatingFactoryBean
返回(它的类是org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean$TargetBeanObjectFactory
)。当你写
@Autowired @Qualifier("exportFactory") ObjectFactory<Export>
, Spring 试图找到Export
类型的 bean名为exportFactory
, 搜索失败。
关于java - Spring 的 ObjectFactoryCreatingFactoryBean 可以与引用接口(interface)的泛型一起工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4000102/