2013-07-11 94 views
33

有人可以解釋Spring bean中的範圍我總是使用'​​prototype',但是有其他參數可以代替嗎?什麼我談論Spring Bean Scopes

<bean id="customerInfoController" class="com.action.customer.Controller" scope="prototype"> 
    <property name="accountDao" ref="accountDao"/> 
    <property name="utilityDao" ref="utilityDao"/> 
    <property name="account_usageDao" ref="account_usageDao"/> 
</bean> 
+0

見[bean作用域](http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s04.html) – Reimeus

+0

HTTP:/ /www.mkyong.com/spring/spring-bean-scopes-examples/ – sanbhat

+0

[這裏有更好的官方文檔](http://docs.spring.io/spring-framework/docs/current/spring-framework- reference/html/beans.html#beans-factory-scopes) – KNU

回答

53

spring specs

例如,有支持五種類型的bean作用域的:

1單(默認*)

每個彈簧對單個對象實例的單個bean定義作用域 IoC容器。

2.原型

作用域一個bean定義任何數量的對象實例。

3.請求

作用域一個bean定義爲單個HTTP 請求的生命週期;也就是說每個HTTP請求都會有一個在單個bean定義背後創建的bean的實例。 僅在可識別Web的Spring ApplicationContext的上下文中有效。

4.會話

作用域一個bean定義的HTTP會話的生命週期。 僅在可識別Web的Spring ApplicationContext的上下文中有效。

5.全球會議

作用域一個bean定義爲全局HTTP會話 的生命週期。通常僅在Portlet上下文中使用時纔有效。只有 在Web感知的Spring ApplicationContext的上下文中有效。

*默認意味着當<bean />標記中沒有明確提供範圍時。 閱讀更多關於他們在這裏:http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s04.html

2

Spring文檔介紹following standard scopes

:(默認)作用域一個bean定義在每個Spring IoC容器中一個對象實例。

原型:將單個bean的作用域定義爲任意數量的對象實例。

請求:將單個bean定義作用於單個HTTP請求的生命週期;也就是說,每個HTTP請求都有自己的實例,這個實例是在單個bean定義的背後創建的。只有在Web感知的Spring ApplicationContext的上下文中才有效。

會話:將作用域定義爲HTTP會話生命週期的單個bean定義。只有在Web感知的Spring ApplicationContext的上下文中才有效。

全局會話:將全局HTTP會話生命週期中的單個bean定義作用域。通常僅在Portlet上下文中使用時纔有效。只有在Web感知的Spring ApplicationContext的上下文中才有效。

還可以使用CustomScopeConfigurer創建和配置其他自定義示波器。一個例子是Spring Webflow添加的flow範圍。

順便說一下,你認爲你總是使用prototype我覺得很奇怪。標準範圍是singleton,在我開發的應用程序中,我很少需要原型範圍。你也許應該看看這個。

4

每個範圍的詳細解釋可以在這裏找到Spring bean scopes。以下是摘要

Singleton - (默認)每個Spring IoC容器將單個bean定義作用於單個對象實例。

原型 - 將單個bean的定義作用於任意數量的對象實例。

請求 - 在單個HTTP請求的生命週期中限定單個bean定義;也就是說,每個HTTP請求都有自己的實例,這個實例是在單個bean定義的背後創建的。只有在Web感知的Spring ApplicationContext的上下文中才有效。

會話 - 將範圍定義爲HTTP會話生命週期中的單個bean定義。只有在Web感知的Spring ApplicationContext的上下文中才有效。

全局會話 - 在全局HTTP會話的生命週期中限定單個bean定義。通常僅在Portlet上下文中使用時纔有效。只有在Web感知的Spring ApplicationContext的上下文中才有效。

12

在Spring中,bean的作用域被用來決定哪個類型的bean實例應該從Spring容器返回給調用者。

5種豆範圍的支持:

  1. 辛格爾頓:它每次返回的Spring IoC container.This單個實例一個bean實例存儲在這種單豆類的高速緩存,以及所有後續請求和對該命名bean的引用返回緩存的對象。如果沒有在bean配置文件中指定bean作用域,則默認爲爲單身。

  2. 原型:每次請求時都會返回一個新的bean實例。它不會像單例那樣存儲任何緩存版本。

  3. 請求:它爲每個HTTP請求返回單個bean實例。

  4. 會話:它爲每個HTTP會話(用戶級會話)返回單個bean實例。

  5. GlobalSession:它爲每個全局HTTP會話返回單個bean實例。它只能在一個Web感知的Spring ApplicationContext(應用程序級會話)的上下文中有效。

在大多數情況下,你可能只處理與Spring的核心範疇 - 原型,默認範圍是

1

只是想要更新,在Spring 5中,如Spring docs中所述,Spring支持6個作用域,其中五個作用域僅在您使用Web感知的ApplicationContext時纔可用。

(默認)作用域一個bean定義爲每Spring IoC容器的單個對象實例。

原型 將單個bean的定義作用於任意數量的對象實例。

請求 作用域單個bean定義到單個HTTP請求的生命週期;也就是說,每個HTTP請求都有自己的實例,這個實例是在單個bean定義的背後創建的。只有在Web感知的Spring ApplicationContext的上下文中才有效。

會話 範圍HTTP會話生命週期的單個bean定義。只有在Web感知的Spring ApplicationContext的上下文中才有效。

應用程序 作用域將ServletContext的生命週期定義爲單個bean。只有在Web感知的Spring ApplicationContext的上下文中才有效。

websocket 將WebSocket生命週期中的單個bean定義作用域。只有在Web感知的Spring ApplicationContext的上下文中才有效。

+0

總共有6個範圍,前兩個可以在沒有網絡感知的情況下使用?如果是這樣,那麼你如何說出6個,其中五個只有在使用Web感知的ApplicationContext時纔可用? – MrKumar