刚刚完成了一个非常长的调试会话。请帮助我了解导致此错误的根本原因/错误实践:
Beans A,B都有一个内部豆看起来完全相同的属性。令人高兴的是,我创建了bean C并通过<bean ref="C">
重用它。
但是,bean C有一个名为"setX"
的方法和一个名为"getLongComputationBasedOnX"
的方法。事实证明,在第一次调用此方法时,它懒惰地使用成员变量缓存计算。对setX的进一步调用不会重置缓存。
所以,在我试图让世界变得更好并重用之后,A和B中C的2次使用都为X设置了不同的值,但是现在它是一个单独的实例并且缓存给出了适合的值在B ...中调用时:(
这是春天的问题吗?我应该使用parent
代替ref
吗?或者它是我的“setX”的糟糕设计,它应该重置缓存?
答案 0 :(得分:3)
只需使用prototype
范围:
<bean id="C" scope="prototype"/>
这样您只有一个C
声明,但有两个实例,一个在注入A
时创建,另一个在{{1}时创建}}
一般来说,很难说出正确的设计应该是什么。根据您的解释,似乎B
应该只使用一个C
值。它应该通过构造函数传递,并使x
使其显式化。
否则你会得到令人讨厌的并发错误:一个线程随后调用final
和setX
,但同时调用另一个名为getLongComputationBasedOnX
的线程。话虽如此,我相信我的setX
解决方案是正确的。