Spring中Bean的作用域 狀態 生命週期

2021-08-14 20:00:12 字數 1937 閱讀 6571

spring 3中為bean定義了5中作用域,分別為singleton(單例)、prototype(原型)、request、session和global session,5種作用域說明如下:

singleton:單例模式,spring ioc容器中只會存在乙個共享的bean例項,無論有多少個bean引用它,始終指向同一物件。singleton作用域是spring中的預設作用域,也可以顯示的將bean定義為singleton模式,配置為:

prototype:原型模式,每次通過spring容器獲取prototype定義的bean時,容器都將建立乙個新的bean例項,每個bean例項都有自己的屬性和狀態,而singleton全域性只有乙個物件。根據經驗,對有狀態的bean使用prototype作用域,而對無狀態的bean使用singleton作用域。

request:在一次http請求中,容器會返回該bean的同一例項。而對不同的http請求則會產生新的bean,而且該bean僅在當前http request內有效。

session:在一次http session中,容器會返回該bean的同一例項。而對不同的session請求則會建立新的例項,該bean例項僅在當前session內有效。

global session:在乙個全域性的http session中,容器會返回該bean的同乙個例項,僅在使用portlet context時有效。

spring容器可以管理singleton作用域下bean的生命週期,在此作用域下,spring能夠精確地知道bean何時被建立,何時初始化完成,以及何時被銷毀。而對於prototype作用域的bean,spring只負責建立,當容器建立了bean的例項後,bean的例項就交給了客戶端的**管理,spring容器將不再跟蹤其生命週期,並且不會管理那些被配置成prototype作用域的bean的生命週期。spring中bean的生命週期的執行是乙個很複雜的過程,讀者可以利用spring提供的方法來定製bean的建立過程。spring容器在保證乙個bean例項能夠使用之前會做很多任務作:

有狀態會話bean :每個使用者有自己特有的乙個例項,在使用者的生存期內,bean保持了使用者的資訊,即「有狀態」;一旦使用者滅亡(呼叫結束或例項結束),bean的生命期也告結束。即每個使用者最初都會得到乙個初始的bean。 

無狀態會話bean :bean一旦例項化就被加進會話池中,各個使用者都可以共用。即使使用者已經消亡,bean 的生命期也不一定結束,它可能依然存在於會話池中,供其他使用者呼叫。由於沒有特定的使用者,那麼也就不能保持某一使用者的狀態,所以叫無狀態bean。但無狀態會話bean 並非沒有狀態,如果它有自己的屬性(變數),那麼這些變數就會受到所有呼叫它的使用者的影響,這是在實際應用中必須注意的。

1.無狀態會話bean 

從字面意思來理解,無狀態會話bean是沒有能夠標識它的目前狀態的屬性的bean。例如:

public

class a

public string hello()

}public

class client

}

在client中生成了兩個a的例項,不管是物件a還是b,它們是沒有狀態的。對於client來說a和b是沒有差別的(但a != b)。所以同乙個無狀態會話bean的例項都是相同的,可以被不同的客戶端重複使用。

2.狀態會話bean 

至於狀態會話bean,可以這樣理解:它是有儲存能力的。也就是說至少有乙個屬性來標識它目前的狀態。例如:

public

class b

public string hello()

}public

class client

}

Spring中Bean的作用域

bean作用域 作用域描述 singleton 在每個spring ioc容器中乙個bean定義對應乙個物件例項。整個容器中只有該bean的唯一例項 prototype 乙個bean定義對應多個物件例項。request session global session 因為這樣在配置中的任何錯誤就會即刻...

spring中bean的作用域

如何使用spring的作用域 這裡的scope就是用來配置spring bean的作用域,它標識bean的作用域。在spring2.0之前bean只有2種作用域即 singleton 單例 non singleton 也稱prototype spring2.0以後,增加了session reques...

Spring中bean的作用域

1 singleton作用域 當乙個bean的作用域設定為singleton,spring ioc容器只會建立該bean定義的唯一例項。2 prototype prototype作用域部署的bean,每一次請求都會產生乙個新的bean例項,相當與乙個new的操作。3 request request表...