Spring原型原型中的bean

我试图将一个prototypebean 注入一个bean,singleton以便对单例bean方法的每个新调用都具有原型bean的新实例。

考虑如下的单例豆:

    @Component

public class SingletonBean {

@Autowired

private PrototypeBean prototypeBean;

public void doSomething() {

prototypeBean.setX(1);

prototypeBean.display();

}

}

我希望每次doSomething()调用该方法时,PrototypeBean都会使用一个新实例。

下面是原型bean:

     @Component 

@Scope(value="prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)

public class PrototypeBean {

Integer x;

void setX(Integer x) {

this.x = x;

}

void display() {

System.out.println(x);

}

}

似乎正在发生的事情是,Spring急于在该doSomething()方法中交付PrototypeBean的新实例。也就是说,该doSomething()方法中的两行代码将在每一行中创建一个新的prototypeBean实例。

因此,在第二行中,prototypeBean.display()输出NULL。

此注入的配置缺少什么?

回答:

从Spring 文档中:

你不需要将<aop:scoped-proxy/>结合用于范围为单例或原型的bean。如果尝试为单例bean创建作用域代理,则会引发BeanCreationException。

对于3.2版文档,文档似乎有所更改,你可以在其中找到以下句子:

你不需要将<aop:scoped-proxy/>结合用于范围为单例或原型的bean。

似乎不希望你使用代理原型Bean,因为每次请求BeanFactory它都会创建一个新实例。

为了为原型bean提供一种工厂,可以使用ObjectFactory以下方法:

@Component

public class SingletonBean {

@Autowired

private ObjectFactory<PrototypeBean> prototypeFactory;

public void doSomething() {

PrototypeBean prototypeBean = prototypeFactory.getObject();

prototypeBean.setX(1);

prototypeBean.display();

}

}

并且原型bean将声明如下:

@Component 

@Scope(value="prototype")

public class PrototypeBean {

// ...

}

以上是 Spring原型原型中的bean 的全部内容, 来源链接: utcz.com/qa/432320.html

回到顶部