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
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...