2014-12-28 55 views
3

早上好。今天早上,當我準備通過Spring參考指南我遇到下面的語句春天的singleton bean怎麼可能用於無狀態的對話?

As a rule, use the prototype scope for all stateful beans and the singleton 
scope for stateless beans. 

Context.getBean(...)總是會返回一個新實例化對象的時候,豆範圍「原型」。那麼我們如何才能實現有狀態的功能呢?我怎麼能在這裏保持對話?

類似地,每個容器只會創建一次「singleton」。所以在多次請求時,它保存着相同的一組數據(如果我們說得更準確,我的意思是最後一個狀態)。那麼關於春季參考文獻中上述聲明的所有內容呢。我很困惑。請幫助我理解這個陳述?我可能會有一個錯誤的理解。

回答

0

在我們的CRUD應用程序中,Spring DAO是一個單例。也就是說,只有jdbc模板初始化是一個類級變量。另一個邏輯是方法調用的所有部分。所以,實際上,狀態是堆棧框架的一部分,不是堆,因此它是線程安全的。

0

想想這樣:

想象一下,你有一個豆 - 例如,一種服務 - 通過一些專用字段來保存複雜調用的狀態(並且可能調用服務使用的其他組件)。如果兩個調用同時發生到該bean /服務,則狀態會受到影響,因爲成員字段無法處理兩個同時調用的狀態。如果你想保持兩個同時呼叫的狀態,你可能需要將狀態存儲在某個鍵的地圖上,例如鍵。線程ID。

但是,如果您使用原型bean,則會爲每個請求/調用創建一個新bean(示例中的服務),並且該狀態可以安全地存儲在該bean的私有字段中,因爲該bean不會在不同請求之間共享。

請注意,如果你想保留幾個請求(如會話狀態或類似)之間的狀態要走的路可能是保存在某種狀態存儲的狀態(如帶有地圖的單豆或者甚至更好的基於例如EhCache的緩存)。