Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Spring中注入自定义ObjectFactory_Java_Spring - Fatal编程技术网

Java 如何在Spring中注入自定义ObjectFactory

Java 如何在Spring中注入自定义ObjectFactory,java,spring,Java,Spring,我正在向bean中注入一个ObjectFactory,以便在需要时获得一个新对象,就像在中完成的一样(请参阅接受的答案) 现在我需要开始使用自定义的对象工厂,它从ApplicationContext获取一个新对象,并执行其他操作。大概是这样的: @Component public class MyDefenderObjectFactory implements ObjectFactory<Defender>, ApplicationContextAware { private A

我正在向bean中注入一个
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;