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

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

在前一篇文章中,我們已經介紹了 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 容器的一切


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

-Advertisement-
Play Games
更多相關文章
  • 記錄,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 個字元,自動添加空字元。 換行符確定輸入結尾,停止讀取。 不保存換行符,用空字元代替換行符。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...