这是春天的豆子:
@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
有任何帮助吗?谢谢!
答案 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}}获得相同的值,但所有这些调用都将针对不同的对象完成。