2011-10-29 74 views
0

春天的豆有兩種類型的作用域(如果你不考慮網絡的範圍):singleton,這是默認和prototype。他們大致在上下文中實現單例和原型設計模式。春天的無狀態和有狀態豆的模擬

因此,如果bean具有原型範圍,它可以像EJB中的有狀態bean一樣擁有唯一的狀態。當bean的範圍是單例時,容器將只創建它的一個實例。所以我們可以說EJB 3.1中的單例bean是春季單例bean的類比。

但是我如何能夠在Spring中獲得無狀態bean的功能(我指的是在EJB容器中合併無狀態bean並且每個線程都有一個無狀態bean的唯一實例)?

+0

請注意,線程具有唯一實例並不是真的。如果一個線程在同一個bean之後進行多次調用,則每個調用可能會在另一個實例中結束。相反,這是相反的。一次只能有一個線程在無狀態會話bean中處於活動狀態,並且框架自動將不同的請求路由到不同的實例。 –

+0

謝謝,我的意思是,你只是在談論 – maks

回答

2

要麼你可以使bean線程安全,並且單例bean是可以的(這是大多數情況)。或者你不能,你將不得不使用原型。我在Spring原型bean和無狀態EJB會話bean之間看到的差異是無狀態會話bean被合併。但在這些年代裏,每次彙集它們或創建一個新實例都沒有太大的區別。每次創建一個新實例甚至可以幫助GC。

+2

池還通過將池設置爲適當的大小來幫助自動資源調節。此外,bean實例*可能很便宜,但其關聯資源可能不是。另外,通過使用代理+池模式,注入許多'豆'變得非常便宜,即使最終不被使用也不會有問題。由於無狀態bean的代理與指向池的URL類似。 –