我知道這個問題聽起來很天真,但我對Web應用程序中bean的範圍有困惑。 我知道,對於每一個請求,一個新的線程是由容器產生的類似的情況下彈簧web應用程序爲每個請求產生一個新的線程,那麼爲什麼建議將我的控制器,服務定義爲單例,不應該這些bean的作用域是原型,因爲每個請求即線程都會有自己的控制器實例,服務要與之協同工作。春天的單身豆
請賜教。
我知道這個問題聽起來很天真,但我對Web應用程序中bean的範圍有困惑。 我知道,對於每一個請求,一個新的線程是由容器產生的類似的情況下彈簧web應用程序爲每個請求產生一個新的線程,那麼爲什麼建議將我的控制器,服務定義爲單例,不應該這些bean的作用域是原型,因爲每個請求即線程都會有自己的控制器實例,服務要與之協同工作。春天的單身豆
請賜教。
https://gottalovedev.wordpress.com/2014/11/23/bean-scope/
給這個一讀。我相信這會有所幫助。
這將是一個巨大的開銷。沒有理由爲什麼每個請求都需要它自己的服務bean,如果你讓你的代碼正確的線程安全,這通常意味着不保留bean上的每個請求狀態。
對象實例化很快。實例化合理服務或控制器的開銷通常不是性能問題,並且線程安全問題較少。特別是對於服務來說,沒有理由*有多個副本(一般情況下),對於控制器來說,參數不是那麼明確。 – 2014-12-13 16:18:33
@DaveNewton實例化速度很快。佈線不是。 – chrylis 2014-12-13 16:27:36
即使創建了新線程(或根據配置重新使用),控制器和服務實例也被重新使用。如果控制器和服務設計得很好,它們可以在請求和不可變的情況下是無狀態的,這將使它們成爲線程安全的。當它們的狀態在創建之後不會改變時,它也會導致更少的對象創建。
我認爲這取決於您是否需要在bean中存儲任何狀態。通常,我編寫我的單例,以便它們不包含任何狀態,僅用於計算業務邏輯。如果沒有狀態需要管理,那麼讓所有線程共享一個單例實例是可以接受的。
而且,我想你應該檢查請求和原型範圍之間的區別http://stackoverflow.com/questions/6480005/spring-request-and-prototype-scope – 2014-12-13 16:33:49