当spring bean为value =“prototype”时,我无法保持bean有状态,proxyMode = ScopedProxyMode.TARGET_CLASS

时间:2015-02-23 06:53:22

标签: spring proxy prototype javabeans

这是春天的豆子:

@Repository
@Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class TestBean {
    private String text;

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}

以下是访问bean的非常简单的代码:

    TestBean testBean = (TestBean) SpringContext.getBean("testBean");//#1
    testBean.setText("aaaaa"); //#2
    System.out.println(testBean.getText()); //#3

,结果是testBean.getText()为null。

当我尝试调试代码时,我发现#2中的testBean实例与#3中的实例不同。例如:

  

#2:TestBean @ 988995e    #3:TestBean @ 69bf7e71

有任何帮助吗?谢谢!

1 个答案:

答案 0 :(得分:0)

SpringContext.getBean("testBean")会为您返回Proxy个对象。任何方法调用都是DynamicAdvisedInterceptor的委托。反过来,target = getTarget();生成CglibMethodInvocation。魔术隐藏在getTarget()中,SimpleBeanTargetSource bean为prototype并且有一个代码:

public Object getTarget() throws Exception {
    return getBeanFactory().getBean(getTargetBeanName());
}

因此,TestBean上的任何方法调用都会询问BeanFactory该类的新实例。这就是setText("aaaaa") testBean.getText()TestBean不可见的原因,因为每种方法都适用于prototype对象,而不是相同。

此类ApplicationContext个对象无法手动更改代码。它们由TestBean管理,只有最后一个可以填充其内部状态。从代码中你只能阅读它们。

如果testBean.getText()填充了相同的值,您将从{{1}}获得相同的值,但所有这些调用都将针对不同的对象完成。