通过@Inject在春天递归调用自己的类

时间:2015-12-24 07:46:54

标签: java spring

@Named
@Scope(value = "prototype")
public class Product extends Factory

{
@Inject
protected Product product;

protected void something(){}

protected void thatThing(){ 

}

正在抛出异常

  

发现依赖:预计至少有1个符合条件的bean   autowire候选人这种依赖。        依赖注释:{@ javax.inject.Inject()}               在org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java)       :292)           在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)           在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)           在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)           at org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:304)           截断。请参阅日志文件以获取完整的堆栈跟踪

1 个答案:

答案 0 :(得分:1)

如果scope设置为prototype,则每次对该特定bean发出请求时,Spring IoC容器都会创建该对象的新bean实例。

在您的代码中,您有一个成员产品。因此,每当您需要新产品时,框架将创建一个新的产品成员实例。并且递归地,成员将再次创建它的成员。所以这显然是不合适的。

我想,也许它应该是这样的:

@Named
public class ProductBuilder extends Factory {

  @Inject
  protected Product product;

  protected void something(){}

  protected void thatThing(){ 

}

然后,对于您的产品,将bean定义为原型:

@Scope(value = "prototype")
public class Product {
  ....
}