spring bean 有五種做用域、生命週期

Spring bean做用域和生命週期.png

spring bean 有五種做用域、兩種管理Bean生命週期的方式。

一、五種做用域

a、Singleton (缺省做用域、單例類型)

容器中只存在一個共享的Bean,只要id與Bean定義相匹配,那就會是同一個Bean。在容器啓動(實例化)時Bean就實例化和初始化(能夠經過lazy-init="true"來設置使得Bean被調用時才初始化)。web

b、Prototype (原型類型)

對有狀態的Bean建議使用Prototype,對無狀態建議使用Singleton。
容器啓動時並無實例化Bean,只有獲取Bean時纔會被建立,而且每一次都是新建一個對象。spring

c、request(web的Spring ApplicationContext下)

每一個HTTP 都會有本身的Bean,當處理結束時,Bean銷燬。session

d、session(web的Spring ApplicationContext下)

每個Http session有本身的Bean學習

e、global session(web的Spring ApplicationContext下)

global session做用域相似於標準的HTTP Session做用域,不過僅僅在基於portlet的web應用中才有意義。Portlet規範定義了全局Session的概念,它被全部構成某個portlet web應用的各類不一樣的portlet所共享。在global session做用域中定義的bean被限定於全局portlet Session的生命週期範圍內。spa

二、生命週期

Bean實例化過程

a、單例管理的對象

Bean在容器啓動時就會實例化和初始化,可是能夠經過Bean的設置來設置對象的初始化時機
第一種:經過設置<bean>.net

<bean id="ServiceImpl" class="cn.csdn.service.ServiceImpl" lazy-init="true"/>

第二種:經過設置<Beans>來修改全部bean默認方式的初始化時機prototype

<beans default-lazy-init="true">

b、非單例管理的對象

Spring讀取xml文件的時候,並不會馬上建立對象,而是在第一次請求該bean時才初始化(如調用getBean方法時)。容器只會實例化和初始化Bean,不會銷燬Bean。清除prototype做用域的對象並釋聽任何prototype bean所持有的昂貴資源,都是客戶端代碼的職責。在初始化後交由調用者管理code

參考: https://blog.csdn.net/fuzhong...
這篇博客有更加詳細介紹。

ps:本人學識有限,歡迎指出錯誤,相互交流學習。xml

相關文章
相關標籤/搜索