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
以下方法:
@Componentpublic 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