Spring02——Spring 中 Bean 的生命周期及其作用域

来源:https://www.cnblogs.com/weechang/archive/2020/03/26/12578180.html

在前一篇文章中,我們已經介紹了 Spring IOC 的相關知識,今天將為個位介紹 Spring 中 Bean 的相關知識。關註我的公眾號「Java面典」,每天 10:24 和你一起瞭解更多 Java 相關知識點。 Bean 的生命周期 Spring 生命周期有四個階段,分別是: 1. 實例化 In ...


在前一篇文章中,我們已經介紹了 Spring IOC 的相關知識,今天將為個位介紹 Spring 中 Bean 的相關知識。關註我的公眾號「Java面典」,每天 10:24 和你一起瞭解更多 Java 相關知識點。

Bean 的生命周期

Spring Bean 生命周期.png

Spring 生命周期有四個階段,分別是:

  1. 實例化 Instantiation
  2. 屬性賦值 Populate
  3. 初始化 Initialization
  4. 銷毀 Destruction

實例化

通過構造器或工廠方法創建 Bean 實例,也就是我們常說的給自己 new 一個對象。

屬性賦值

為 Bean 的屬性設置值和對其他 Bean 的引用,主要涉及以下幾個方面的內容:

  • IOC 依賴註入:按照 Spring 上下文對實例化的 Bean 進行配置,也就是 IOC 註入;
  • setBeanName 實現:如果這個 Bean 已經實現了 BeanNameAware 介面,會調用它實現的 setBeanName(String)方法,此處傳遞的就是 Spring 配置文件中 Bean 的 id 值;
  • BeanFactoryAware 實現:如果這個 Bean 已經實現了 BeanFactoryAware 介面,會調用它實現的 setBeanFactory,setBeanFactory(BeanFactory)傳遞的是 Spring 工廠自身(可以用這個方式來獲取其它 Bean,只需在 Spring 配置文件中配置一個普通的 Bean 就可以);
  • ApplicationContextAware 實現:如果這個 Bean 已經實現了 ApplicationContextAware 介面,會調用setApplicationContext(ApplicationContext)方法,傳入 Spring 上下文(同樣這個方式也可以實現步驟 4 的內容,但比 4 更好,因為 ApplicationContext 是 BeanFactory 的子介面,有更多的實現方法);
  • postProcessBeforeInitialization 介面實現-初始化預處理:如果這個 Bean 關聯了 BeanPostProcessor 介面,將會調用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor 經常被用作是 Bean 內容的更改,並且由於這個是在 Bean 初始化結束時調用那個的方法,也可以被應用於記憶體或緩存技術。

初始化

  • init-method:如果 Bean 在 Spring 配置文件中配置了 init-method 屬性會自動調用其配置的初始化方法;
  • postProcessAfterInitialization:如果這個 Bean 關聯了 BeanPostProcessor 介面,將會調用postProcessAfterInitialization(Object obj, String s)方法。

註:以上工作完成以後就可以應用這個 Bean 了,那這個 Bean 是一個 Singleton 的,所以一般情況下我們調用同一個 id 的 Bean 會是在內容地址相同的實例,當然在 Spring 配置文件中也可以配置非 Singleton。

銷毀

destroy:當 Bean 不再需要時,會經過清理階段,如果 Bean 實現了 DisposableBean 這個介面,會調用其實現的 destroy() 方法;

bean 標簽有兩個重要的屬性(init-method 和 destroy-method),可以來自定義初始化和註銷方法,其對應的註解分別是 @PostConstruct 和 @PreDestroy。

<bean id="" class="" init-method="初始化方法" destroy-method="銷毀方法">

Spring Bean 作用域

Spring 中為 Bean 定義了 5 中作用域,分別為 singleton(單例)、prototype(原型)、request(請求)、session(會話) 和 global session(全局會話),5 種作用域說明如下:

singleton (單例模式)

Spring IOC 容器中只會存在一個共用的 Bean 實例,無論有多少個 Bean 引用它,始終指向同一對象。Singleton 作用域是 Spring 中的預設作用域,也可以顯示的將 Bean 定義為 singleton 模式,配置為:

<bean id="userDao" class="com.ioc.UserDaoImpl" scope="singleton"/>

該模式在多線程下是不安全的。

prototype(原型模式)

每次通過 Spring 容器獲取 prototype 定義的 bean 時,容器都將創建一個新的 Bean 實例,每個 Bean 實例都有自己的屬性和狀態,而 singleton 全局只有一個對象。
一般而言,對有狀態的 Bean 使用 prototype 作用域,而對無狀態的 Bean 使用 singleton 作用域。

request(單次請求模式)

在一次 Http 請求中,容器會返回該 Bean 的同一實例。而對不同的 Http 請求則會產生新的 Bean,而且該 Bean 僅在當前 Http Request 內有效,當前 Http 請求結束,該 bean實例也將會被銷毀。

<bean id="loginAction" class="com.cnblogs.Login" scope="request"/>

session(會話模式)

在一次 Http Session 中,容器會返回該 Bean 的同一實例。而對不同的 Session 請求則會創建新的實例,該 Bean 實例僅在當前 Session 內有效。同 Http 請求相同,每一次 Session 請求創建新的實例,而不同的實例之間不共用屬性,且實例僅在自己的 Session 請求內有效,請求結束,則實例將被銷毀。

<bean id="userPreference" class="com.ioc.UserPreference" scope="session"/>

global Session(全局會話模式)

global Session:在一個全局的 Http Session 中,容器會返回該 Bean 的同一個實例,僅在使用 portlet context 時有效。

Spring 系列推薦

Spring01——你應該瞭解的,有關 IOC 容器的一切


您的分享是我們最大的動力!

更多相關文章
  • 記錄,VBScript 如何打開,含有"空格"的路徑。這個問題和常見,卻總是忘! 直接上代碼了,多說無益。 這就是,解決方法! 就是在 path 兩邊個加上, 3層雙引號! 如果直接運行 ,代碼會報錯,或者根本打不開, 因為,代碼不知為何,打開的是,空格之間的那段路徑, 所以,會顯示找不到路徑! 這 ...
  • 一、多線程 1.基本概念: (1)進程:一個進程對應一個應用程式。例如:在windows中啟動Word就表示啟動了一個進程。在java的開發環境中啟動JVM,就表示啟動了一個進程。現在電腦是支持多進程的,在同一個操作系統中,可以啟動多個進程。 (2)多進程的作用:多進程的作用不是提高執行速度,而是 ...
  • day2 pyCharm的debug模式使用,while迴圈結構,格式化輸出,運算符,編碼初識 pyCharm的debug模式 點擊需要調試(或者有問題的)行左側,出現小紅點,然後shift+f9,進入debug模式,下方有debuger和consloe(控制台)兩個tab,選擇console_ta ...
  • 人物介紹 | | HelloWorld | |: |: | | | .cpp | | | D:\ | | | 25106D2879A9EA300BB264F8155A71D7C44DA2E8 | 故事簡介 1. "編寫源文件" 2. "預編譯" 3. "編譯" 4. "彙編" 5. "鏈接" 一、編 ...
  • 字元集 通用字元名 以 \u 或 \U 打頭 \u 後4 個十六進位位,\U 後8 個十六進位位。 這些位表示的是字元的 ISO 10646 碼點。 在源代碼中,可使用適用於所有系統的通用編碼名,而編譯器將根據當前系統使用合適的內部編碼來表示它。 寬字元(wchar_t) 整數類型。 可以表示系統使 ...
  • 初始化 變數: c:int cwls = 10; c++: int wrens(432); c++11: int emus{7}; int rheas={12}; 括弧中不包含任何東西,變數初始化為 0 ; 適用於任何類型,等號可有可無; 結構體: C: inflatable guest= { "G ...
  • 枚舉 enum:創建符號常量的方式 enum spectrum { red, orange, yellow, green, blue, violet, indigo, ultraviolet }; spectrum 被稱為枚舉,red 等作為符號常量,這些符號常量叫做枚舉量。 預設將整數值賦給枚舉量 ...
  • 字元串輸入 面向單詞 cin : 使用空白(空格、製表符和換行符)來確定字元串的結束位置。 自動添加空字元。 面向行 getline(m,n) m 存儲輸入行的數組名稱,n 為讀取字元數。 最多讀取 n-1 個字元,自動添加空字元。 換行符確定輸入結尾,停止讀取。 不保存換行符,用空字元代替換行符。 ...
一周排行
  • 前幾天發佈了 "抄抄《CSS 故障藝術》的動畫" 這篇文章,在這篇文章里介紹瞭如何使用Win2D繪製文字然後配合BlendEffect製作故障藝術的動畫。本來打算就這樣收手不玩這個動畫了,但後來又發現性能不符合理想。明明只是做做Resize動畫和用BlendEffect混合,為什麼性能會這麼差呢? ...
  • 控制條控制項: progressBar 不能按照你程式的進程自動變化,需認為計算,調整變化量 private void progressBar1_Click(object sender, EventArgs e) { this.progressBar1.Maximum = 100;//設置進度條最大長 ...
  • 首先創建一個asp.net core web應用程式 第二步 目前官方預置了7種模板項目供我們選擇。從中我們可以看出,既有我們熟悉的MVC、WebAPI,又新添加了Razor Page,以及結合比較流行的Angular、React前端框架的模板項目。 空項目模板 Program.cs using S ...
  • 對閉包的理解 1.對於成員變數和局部變數:成員變數就是方法外部,類的內部定義的變數;局部變數就是方法或語句塊內部定義的變數。局部變數必須初始化。 形式參數是局部變數,局部變數的數據存在於棧記憶體中。棧記憶體中的局部變數隨著方法的消失而消失。成員變數存儲在堆中的對象裡面,由垃圾回收器負責回收。 成員變數它 ...
  • Xamarin.Forms讀取並展示Android和iOS通訊錄 TerminalMACS客戶端 本文同步更新地址: https://dotnet9.com/11520.html https://terminalmacs.com/861.html 閱讀導航: 一、功能說明 二、代碼實現 三、源碼獲取 ...
  • 做下對文件複製操作相關的筆記: /// <summary> /// 文件幫助類 /// </summary> public class FileHelper { /// <summary> /// 複製一個目錄下所有文件到一個新目錄下 /// </summary> /// <param name=" ...
  • 前言 有一個東西叫做鴨子類型,所謂鴨子類型就是,只要一個東西表現得像鴨子那麼就能推出這玩意就是鴨子。 C 裡面其實也暗藏了很多類似鴨子類型的東西,但是很多開發者並不知道,因此也就沒法好好利用這些東西,那麼今天我細數一下這些藏在編譯器中的細節。 不是只有 和 才能 在 C 中編寫非同步代碼的時候,我們經 ...
  • [toc] 1.應用背景 底端設備有大量網路報文(位元組數組):心跳報文,數據採集報文,告警報文上報。需要有對應的報文結構去解析這些位元組流數據。 2.結構體解析 由此,我第一點就想到了用結構體去解析。原因有以下兩點: 2.1.結構體存在棧中 類屬於引用類型,存在堆中;結構體屬於值類型,存在棧中,在一個 ...
  • 《深入淺出 C#》 (第3版) [作者] (美) Andrew Stellman (美) Jennifer Greene[譯者] (中) 徐陽 丁小峰 等譯[出版] 中國電力出版社[版次] 2016年08月 第1版[印次] 2018年04月 第4次 印刷[定價] 148.00元 【引子】 要學習編程 ...
  • 記錄使用對象初始值設定項初始化對象。 using System; using System.Collections.Generic; namespace ConsoleApp2 { class Program { static void Main(string[] args) { // 使用構造函數 ...
x