Spring可定義Bean的實例範圍(scope)如下。
- singleton(預設)
- prototype
- request
- session
- application
- websocket
Singleton
預設的bean scope,整個IoC容器中只會有一個實例,又稱單例。若bean無狀態(stateless),使用singleton scope。
Prototype
每次被調用(注入)時都是產生新的實例。若bean有狀態(stateful),使用prototype bean。注意若注入的對象為singleton bean的成員,則該prototype僅在singleton對象初始時實例化一次,也就是說每次singleton bean被調用時使用的prototype bean都是同一個。
Request
Web環境才有的scope。實例的scope為HTTP Request
,同個request的實例為同一個,也就是不同request的實例是不同的。
Session
Web環境才有的scope。實例的scope為HTTP Session
,同個session的實例為同一個,也就是不同session的實例是不同的。
Application
Web環境才有的scope。實例的scope為ServletContext
,同個ServletContext
的實例為同一個,也就是不同ServletContext
的實例是不同的。
WebSocket
Web環境才有的scope。實例的scope為WebSocket
,同個WebSocket
的實例為同一個,也就是不同WebSocket
的實例是不同的。
你好, 謝謝你的網誌, 讓我學了很多 Spring 相關的技術,
回覆刪除我想問一下 Singleton 跟 static Class 的使用情境下有區別嗎?
以 Jackson 的 JSON 序列化工具, 通常會需要一個 ObjectMapper,
那這個 ObjectMapper 宣告為 Singleton bean 或是直接用 static Class ?
有什麼差異嗎?
回覆刪除1. 單例類別(Singlton)(這邊我認為應該是您筆誤寫成static class,因為top level class並不允許為static)與Spring Singlton Bean還是有點區別。單例類別在整個應用程式生命週期中只有一個,而Spring Singlton Bean是在ApplicationContext生命週期中只有一個。不過實際上用起來差不多,因為工作上少用多個ApplicationContext的情況。
2. Jackson的ObjectMapper物件是thread-safe的,無論您要自行實作在單例類別中,還是透過設為Spring Singlton Bean都可以,但要注意一旦配置後則整個應用程式生命週期中都會是同個ObjectMapper配置,如果要有不同的配置就要另外new一個新的ObjectMapper實例。
3. 沒有特殊要求下,可以把ObjectMapper註冊為@Bean,然後透過@Autowird注入到你要用的地方吧。
不過在ObjectMapper API文件中提到....
回覆刪除Construction of new ObjectReaders and ObjectWriters is a very light-weight operation so it is usually appropriate to create these on per-call basis, as needed, for configuring things like optional indentation of JSON.
所以每次要用到ObjectMapper的時候在new一個新的實例 (如果沒有什麼特殊配置要求的情況下)也行,因為建構新實例的成本很低。
結論就是,你可以混用,一體適用的配置設定為Singlton Bean,有例外情況就另外new個新的實例
@Matt, 非常詳細的解釋 :) 感謝.
回覆刪除