我正在尝试注入prototype
豆子在一个singleton
这样,每次对单例 bean 方法的新调用都会有一个原型 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 过于急于在中移交 Prototype Bean 的新实例doSomething()
方法。也就是里面的2行代码doSomething()
方法在每一行中创建一个新的prototypeBean实例。
所以在第二行 -prototypeBean.display()
prints NULL.
此注入的配置中缺少什么?
从春天开始文档 http://docs.spring.io/spring/docs/3.0.0.RELEASE/spring-framework-reference/html/beans.html#beans-factory-scopes:
您不需要使用<aop:scoped-proxy/>
和这个结合
范围为单例或原型的 bean。如果你尝试
为单例 bean 创建一个作用域代理,即 BeanCreationException
被提出。
3.2 版本的文档似乎发生了一些变化文档 http://docs.spring.io/spring-framework/docs/3.2.0.BUILD-SNAPSHOT/reference/htmlsingle/哪里可以找到这句话:
您不需要使用<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 {
// ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)