AdSense

網頁

2020/6/2

Spring Bean的種類範圍 bean scope

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的實例是不同的。


4 則留言:

冬天好涼 提到...

你好, 謝謝你的網誌, 讓我學了很多 Spring 相關的技術,
我想問一下 Singleton 跟 static Class 的使用情境下有區別嗎?
以 Jackson 的 JSON 序列化工具, 通常會需要一個 ObjectMapper,
那這個 ObjectMapper 宣告為 Singleton bean 或是直接用 static Class ?
有什麼差異嗎?

Matt 提到...


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注入到你要用的地方吧。

Matt 提到...

不過在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, 非常詳細的解釋 :) 感謝.

AdSense