Java 如何在Spring中注入自定义ObjectFactory
我正在向bean中注入一个Java 如何在Spring中注入自定义ObjectFactory,java,spring,Java,Spring,我正在向bean中注入一个ObjectFactory,以便在需要时获得一个新对象,就像在中完成的一样(请参阅接受的答案) 现在我需要开始使用自定义的对象工厂,它从ApplicationContext获取一个新对象,并执行其他操作。大概是这样的: @Component public class MyDefenderObjectFactory implements ObjectFactory<Defender>, ApplicationContextAware { private A
ObjectFactory
,以便在需要时获得一个新对象,就像在中完成的一样(请参阅接受的答案)
现在我需要开始使用自定义的对象工厂
,它从ApplicationContext获取一个新对象,并执行其他操作。大概是这样的:
@Component
public class MyDefenderObjectFactory implements ObjectFactory<Defender>, ApplicationContextAware
{
private ApplicationContext appCtx;
@Override
public Defender getObject () throws BeansException
{
// Some other operation we need to run upon new object creation
System.out.println ( "New Defender being returned" );
return this.appCtx.getBean ( Defender.class );
}
@Override
public void setApplicationContext ( ApplicationContext applicationContext ) throws BeansException
{
this.appCtx = applicationContext;
}
}
然而,Spring并没有使用这个类将ObjectFactorybean注入到defenderFactory
。怎样才能做到呢?我还尝试将@限定符(“MyDefenderObjectFactory”)
添加到上面的defenderFactory
字段,但没有成功。正如您所看到的ObjectFactory
解析是硬编码的,由Spring内部处理:
else if (ObjectFactory.class == descriptor.getDependencyType()) {
return new DependencyObjectFactory(descriptor, beanName);
}
这意味着您在按类型解析时无法获取MyDefenderObject工厂
,如果要按名称解析,则可以获取该工厂,为此,您需要使用先按名称解析的资源
注释:
@Resource(name="myDefenderObjectFactory")
ObjectFactory<Defender> defenderFactory;
@Resource(name=“MyDefenderObject工厂”)
目标工厂卫士工厂;
显示defenderFactory
的代码。MyDefenderObjectFactory
在Spring被告知扫描的包中吗?@JimGarrison defenderFactory来自我链接的示例,我也扩展了我的问题以报告其代码。是的,我的工厂是由Spring挑选的,我可以在日志消息中看到这一点,但它只是作为一个bean分开,不用于自动注入。您必须在问题中包含所有相关代码,因为非现场链接会随着时间的推移而变差。请添加defenderFactory
的代码,显示您期望注射发生的方式。我已经完成了,尽管我链接了另一个SO问题,所以它不太可能消失。我也得到了Oleg的一个很好的答案,见下文。谢谢@Oleg。我同意这个。我认为Spring硬编码(如果不是bug的话)应该得到改进。@zakmck是的,我同意。至少,这方面的记录非常缺乏。
@Resource(name="myDefenderObjectFactory")
ObjectFactory<Defender> defenderFactory;