spring的配置bean元素時,其scope屬性取值有如下幾個:
1.singleton:單例模式,即該bean對應的類只有乙個例項;在
spring
中是scope(
作用範圍
)引數的預設值;
2.prototype:表示每次從容器中取出bean時,都會生成乙個新例項;相當於new出來乙個物件;
3.request:基於web,表示每次接受乙個請求時,都會生成乙個新例項;
4.session:表示在每乙個session中只有乙個該物件.
*還有global session以及自定義的scope,我們這裡就不多說啦
單例模式,在spring 中其實是scope(作用範圍)引數的預設值
每個bean定義只生成乙個物件例項,每次getbean請求獲得的都是此例項;這個單一例項會被儲存到單例快取(singleton cache)中,並且所有針對該bean的後續請求和引用都將返回被快取的物件例項;
單例模式分為餓漢模式和懶漢模式
餓漢模式
spring singleton的預設是餓漢模式:啟動容器時(即例項化容器時),為所有spring配置檔案中定義的bean都生成乙個例項
懶漢模式
在第乙個請求時才生成乙個例項,以後的請求都呼叫這個例項
spring singleton設定為懶漢模式:
另一種和singleton對應的scope值---prototype多例項模式
呼叫getbean時,就new乙個新例項
singleton和prototype的比較
singleton
xml配置檔案:
hibernate.impl.***typedaoimpl" />
測試**:
執行:
true
com.machome.hibernate.impl.***typedaoimpl@15b0333
com.machome.hibernate.impl.***typedaoimpl@15b0333
說明前後兩次getbean()獲得的是同一例項,說明spring預設是單例
prototype
執行同樣的測試**
執行:false
com.machome.hibernate.impl.***typedaoimpl@afae4a
com.machome.hibernate.impl.***typedaoimpl@1db9852
說明scope="prototype"後,每次getbean()的都是不同的新例項
注意:所有無狀態的bean都配置成singleton(單例項),無狀態的類一般是指,
service層、manager層的業務邏輯處理類;而配置的不同絕對會影響程式的效率.
而一般的action需要配置成prototype或request,因為action是有狀態的;例如不同的人的action裡面的使用者名稱和密碼都是不同的;
如果不指定該屬性的話預設取singleton,盡量少的建立物件;
對於service層不配置也沒問題,因為預設取singleton;
而如果action型別的bean不配置該屬性,那麼程式絕對會出錯,因為action是有狀態的,不能按預設的單例模式生成物件.
spring中的屬性scope
之前在開發過程中遇到了乙個問題,當request發起下乙個請求的時候,action中的屬性值並沒有清除,而是繼續採用上次使用過的引數值進行查詢並響應,導致資料查詢不真實或失敗。對此,有同事告訴我說,需要在spring配置檔案的bean中新增屬性scope prototype。結果還真的有用。下面是我...
小談spring中的scope屬性
在一次做專案時遇到了這樣的一則警告 invocation of destroy method close failed on bean with name sqlsession html view plain copy print?bean id sqlsessiontemplate class o...
Spring中bean中scope屬性的意義
scope prototype 預設情況下,從 bean工廠所取得的例項為singleton bean的singleton屬性 singleton spring容器只存在乙個共享的bean例項,預設的配置。prototype 每次對bean的請求都會建立乙個新的bean例項。二者選擇的原則 有狀態的...