每次调用其方法时都会重新创建CGlib-wired bean

时间:2014-11-13 07:53:01

标签: java spring inversion-of-control cglib

我观察了原型范围内代理的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();

1 个答案:

答案 0 :(得分:0)

我已经切换到JDK代理,他们不会在每个bean方法调用上重新创建bean。

现在用

注释bean
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)