我观察了原型范围内代理的Spring bean的一些奇怪行为。我使用的是Spring 4.1.2。
我手动创建一个bean,然后我调用它的方法3次。在每次方法调用时,都会创建一个新的类实例 - 下面的代码会打印一个新的ID。这意味着我无法可靠地将状态存储在bean中。
预期: 该类的单个实例。
观察到的: 每个bean方法调用都会导致新的类实例创建。
我已经挖掘了CGlib - 它为每个方法调用从bean工厂获取目标Spring bean。 Spring bean工厂每次都会愉快地创建一个新bean(因为它是一个原型bean)。
这是预期的行为还是错误?
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class BeanClass1 extends SomeAbstractClass implements I1, I2 {
public void tellMe() {
System.out.println(this);
}
}
BeanClass1 bean = beanFactory.getBean(BeanClass1.class);
bean.tellMe();
bean.tellMe();
bean.tellMe();
答案 0 :(得分:0)
我已经切换到JDK代理,他们不会在每个bean方法调用上重新创建bean。
现在用
注释bean@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)