重用spring bean在缓存时会导致讨厌的错误吗?

时间:2011-11-20 15:27:56

标签: spring

刚刚完成了一个非常长的调试会话。请帮助我了解导致此错误的根本原因/错误实践:

Beans A,B都有一个内部豆看起来完全相同的属性。令人高兴的是,我创建了bean C并通过<bean ref="C">重用它。

但是,bean C有一个名为"setX"的方法和一个名为"getLongComputationBasedOnX"的方法。事实证明,在第一次调用此方法时,它懒惰地使用成员变量缓存计算。对setX的进一步调用不会重置缓存。

所以,在我试图让世界变得更好并重用之后,A和B中C的2次使用都为X设置了不同的值,但是现在它是一个单独的实例并且缓存给出了适合的值在B ...中调用时:(

这是春天的问题吗?我应该使用parent代替ref吗?或者它是我的“setX”的糟糕设计,它应该重置缓存?

1 个答案:

答案 0 :(得分:3)

只需使用prototype范围:

<bean id="C" scope="prototype"/>

这样您只有一个C 声明,但有两个实例,一个在注入A时创建,另一个在{{1}时创建}}

一般来说,很难说出正确的设计应该是什么。根据您的解释,似乎B应该只使用一个C值。它应该通过构造函数传递,并使x使其显式化。

否则你会得到令人讨厌的并发错误:一个线程随后调用finalsetX,但同时调用另一个名为getLongComputationBasedOnX的线程。话虽如此,我相信我的setX解决方案是正确的。