2014-12-13 197 views
5

我知道這個問題聽起來很天真,但我對Web應用程序中bean的範圍有困惑。 我知道,對於每一個請求,一個新的線程是由容器產生的類似的情況下彈簧web應用程序爲每個請求產生一個新的線程,那麼爲什麼建議將我的控制器,服務定義爲單例,不應該這些bean的作用域是原型,因爲每個請求即線程都會有自己的控制器實例,服務要與之協同工作。春天的單身豆

請賜教。

+0

而且,我想你應該檢查請求和原型範圍之間的區別http://stackoverflow.com/questions/6480005/spring-request-and-prototype-scope – 2014-12-13 16:33:49

回答

1

https://gottalovedev.wordpress.com/2014/11/23/bean-scope/

給這個一讀。我相信這會有所幫助。

+0

感謝您提供鏈接,它回答了我的問題。 – Apollo 2014-12-13 18:14:50

+0

不客氣!如果您對spring/java中的任何其他主題有疑問,請發出請求,我將在該主題上寫一篇文章。 – Pratik 2014-12-13 18:25:13

+0

似乎您的鏈接已損壞... – coderz 2015-05-10 08:14:26

6

這將是一個巨大的開銷。沒有理由爲什麼每個請求都需要它自己的服務bean,如果你讓你的代碼正確的線程安全,這通常意味着不保留bean上的每個請求狀態。

+0

對象實例化很快。實例化合理服務或控制器的開銷通常不是性能問題,並且線程安全問題較少。特別是對於服務來說,沒有理由*有多個副本(一般情況下),對於控制器來說,參數不是那麼明確。 – 2014-12-13 16:18:33

+3

@DaveNewton實例化速度很快。佈線不是。 – chrylis 2014-12-13 16:27:36

3

即使創建了新線程(或根據配置重新使用),控制器和服務實例也被重新使用。如果控制器和服務設計得很好,它們可以在請求和不可變的情況下是無狀態的,這將使它們成爲線程安全的。當它們的狀態在創建之後不會改變時,它也會導致更少的對象創建。

0

我認爲這取決於您是否需要在bean中存儲任何狀態。通常,我編寫我的單例,以便它們不包含任何狀態,僅用於計算業務邏輯。如果沒有狀態需要管理,那麼讓所有線程共享一個單例實例是可以接受的。