Spring 中 Bean 的生命周期

一、什么是 Bean 生命周期?

Spring 中的 Bean 生命周期是指一個 Bean 從 被容器創建最終銷毀 所經歷的一系列過程。

它體現了 Spring IOC 容器在管理 Bean 實例時所執行的各個鉤子流程,包括初始化、依賴注入、增強處理、銷毀等多個環節。


二、Bean 生命周期完整流程(邏輯順序)

1. 實例化(Constructor)
2. 屬性注入(依賴注入,DI)
3. 感知階段(Aware 接口)
4. 初始化前處理(BeanPostProcessor#postProcessBeforeInitialization)
5. 初始化(@PostConstruct 或 InitializingBean#afterPropertiesSet)
6. 初始化后處理(BeanPostProcessor#postProcessAfterInitialization)
7. Bean 就緒可用
8. 銷毀前處理(@PreDestroy 或 DisposableBean#destroy)

三、生命周期各階段詳細說明


實例化(Instantiation)

  • BeanFactoryApplicationContext 通過 反射調用構造方法 創建 Bean 實例。
  • 此時 Bean 的屬性尚未注入。
public class UserService {public UserService() {System.out.println("構造方法執行:Bean 被實例化");}
}

屬性注入(依賴注入)

  • Spring 通過反射將依賴的屬性注入到實例中。
  • 包括:@Autowired@Value、構造器注入等。

感知接口回調(Aware 接口)

如果 Bean 實現了以下接口,Spring 會注入相關上下文信息:

接口名描述
BeanNameAware獲取當前 Bean 的名字
BeanFactoryAware獲取當前 BeanFactory 實例
ApplicationContextAware獲取當前 ApplicationContext
public class MyBean implements BeanNameAware {@Overridepublic void setBeanName(String name) {System.out.println("BeanNameAware:我的名字是 " + name);}
}

初始化前處理(BeanPostProcessor)

  • Spring 提供的擴展點之一;
  • 所有實現了 BeanPostProcessor 接口的類會在每個 Bean 初始化前后被回調。
public Object postProcessBeforeInitialization(Object bean, String beanName);

初始化(核心)

以下三種初始化方式 Spring 均支持:

方式示例
注解方式@PostConstruct(推薦)
接口方式實現 InitializingBean 接口的 afterPropertiesSet() 方法
XML 配置init-method="init"(在 XML 中顯式指定)
@PostConstruct
public void init() {System.out.println("初始化邏輯執行");
}

初始化后處理(BeanPostProcessor)

  • 允許開發者對 Bean 進行增強(如 AOP 就是基于此);
  • 可以返回原 Bean,也可以返回代理對象。
public Object postProcessAfterInitialization(Object bean, String beanName);

Bean 就緒可用

  • Spring 容器完成了 Bean 的初始化,此時可以被應用程序正常使用;
  • Bean 已經具備所有依賴關系,準備投入業務運行。

銷毀階段(Destruction)

Spring 會在容器關閉時銷毀單例 Bean:

銷毀方式示例
注解方式@PreDestroy(推薦)
接口方式實現 DisposableBean#destroy()
XML 配置destroy-method="destroy"
@PreDestroy
public void cleanup() {System.out.println("Bean 即將銷毀,釋放資源");
}

注意:默認只銷毀單例 Bean,且前提是容器必須正常關閉,如:

((ConfigurableApplicationContext) context).close();

四、完整生命周期流程示意圖

構造器實例化 →
屬性注入 →
xxxAware 接口 →
postProcessBeforeInitialization →
@PostConstruct / afterPropertiesSet →
postProcessAfterInitialization →
應用使用 →
@PreDestroy / destroy

五、常見問題

Bean 的生命周期中哪個階段可用于增強?

  • 答:BeanPostProcessor 是關鍵,它可以包裹原始 Bean,進行代理或包裝。

Bean 是什么時候被創建的?

  • 默認是容器啟動時(單例 Bean)
  • 如果是 @Lazyprototype,則是 首次使用時

Bean 銷毀時會自動釋放資源嗎?

  • 只會執行自定義的 destroy() 方法或 @PreDestroy
  • 對于像數據庫連接、線程池等,需要手動在銷毀鉤子中關閉資源。

六、總結一

Spring Bean 的生命周期涵蓋:創建 → 初始化 → 可用 → 銷毀 全流程。通過實現各種接口或使用注解(如 @PostConstruct@PreDestroy),可以在各階段插入自定義邏輯,方便資源初始化與釋放。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86904.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86904.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86904.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++ 中 std::string 與 QString 的深度剖析

在 C 編程領域,std::string 和 QString 是兩種廣泛應用的字符串類型,它們在設計理念、功能特性以及適用場景上都呈現出鮮明的特點。本文將從多個維度對這兩種字符串類型進行深度剖析,并詳細闡述它們之間的相互轉化方法。 std::string 是 C 標…

不止于“修補”:我如何用Adobe AI重塑設計與視頻敘事流程

最近我深度體驗了一把來自英國Parvis School of Economics and Music的Adobe正版教育訂閱,在把玩PhotoShop、Premiere Pro這些“老伙計”的新功能時,的確挖到了一些寶藏,覺得非常有必要與大家說道說道。首先得聊聊這個訂閱給我的直觀感受&…

重頭開始學ROS(5)---阿克曼底盤的URDF建模與Gazebo控制(使用Xacro優化)

阿克曼底盤的URDF建模與Gazebo控制(使用Xacro優化) 阿克曼底盤建模 建模 我們使用后輪驅動,前輪轉向的阿克曼底盤模型。 那么對于后輪只需進行正常的continous joint連接即可 對于前輪,有兩個自由度,旋轉和轉向&…

RabbitMq中啟用NIO

? 所屬類 com.rabbitmq.client.ConnectionFactory🧠 使用背景 RabbitMQ Java 客戶端默認使用傳統的 阻塞 I/O (java.net.Socket) 實現。如果你希望: 更好地控制 線程數獲得更好的 并發性能降低 每個連接的線程占用在高并發連接或消費者數量較多的系統…

[Dify]-基礎篇2- 如何注冊并快速上手 Dify 平臺

在生成式 AI 應用開發新時代,如何快速搭建一個高效、可維護、易上線的 AI 工具,是每位開發者關注的核心。Dify,正是為此而生的一站式平臺。本篇將以新手視角,帶你從注冊賬號、配置環境,到構建應用、部署上線,手把手完成你的第一個 AI 項目。 注冊并設置工作環境 1. 賬號…

Java面試寶典:基礎七

153. 如何實現對象克隆? 答: 對象克隆有兩種主要方式: 淺克隆:實現Cloneable接口并重寫Object.clone() class Person implements Cloneable {String name;Car car; // 引用類型@Override

spring-security原理與應用系列:requestMatchers和authorizeRequests

目錄 簡單示例 WebSecurityConfig requestMatchers ???????requestMatchers ???????antMatchers ???????chainRequestMatchers ???????setMatchers ???????requestMatcher ???????WebSecurity ???????performBuild…

Bessel位勢方程求解步驟

問題 考慮偏微分方程(PDE): ? Δ u u f , x ∈ R n , -\Delta u u f, \quad x \in \mathbb{R}^n, ?Δuuf,x∈Rn, 其中 f ∈ L 2 ( R n ) f \in L^2(\mathbb{R}^n) f∈L2(Rn)。這是一個線性橢圓型方程,稱為 Bessel 位勢方…

if __name__ == ‘__main__‘:

基本概念 if __name__ __main__: 是一個條件判斷語句,用于確定當前模塊是作為主程序運行,還是被其他模塊導入。 __name__ 變量 __name__ 是Python的一個內置變量,表示當前模塊的名稱當一個模塊被直接運行時,__name__ 的值會被…

淺談Apache HttpClient的相關配置和使用

Apache HttpClient是由Apache軟件基金會維護的一款開源HTTP客戶端庫,對比最基礎的 HttpURLConnection 而言,它的優勢時支持連接池管理,攔截器(Interceptor)機制,同步/異步請求支持等能力。 在使用這個組件時&#xff…

【Teensy】在ArduinoIDE中配置Teensy4.1

1.文件——首選項 在其他開發板管理器地址這里添加: https://www.pjrc.com/teensy/package_teensy_index.json 點擊確定! 2.安裝Teensy(for Arduino IDE…) 按照圖中1,2,3操作!可以選擇上一個版本(不使用最…

企業自建云概念解讀|私有云、專有云、混合云、分布式云、企業云

隨著云計算技術逐漸成熟,越來越多的企業開始在本地數據中心自行搭建云平臺,滿足數據合規、業務性能與連續性、節約成本等多方面的需求。不過,面對多種多樣的自建云產品,不少用戶會有類似的疑問:自建云等于私有云嗎&…

反彈 Shell 升級為全交互終端的兩種高效方法

目錄 ?? 升級反彈 Shell 為全交互終端:兩種高效方法 ??? 方法 1:利用 Python pty.spawn 創建偽終端 ?? 操作步驟

Hyper-YOLO: When Visual Object Detection Meets Hypergraph Computation論文精讀(逐段解析)

Hyper-YOLO: When Visual Object Detection Meets Hypergraph Computation論文精讀(逐段解析) 論文地址:https://arxiv.org/abs/2408.04804 CVPR 2024 Yifan Feng, Jiangang Huang, Shaoyi Du, Senior Member, IEEE, Shihui Ying, Jun-Hai Y…

Windows 下配置多個 GitHub 賬號的 SSH Key

Windows 下配置多個 GitHub 賬號的 SSH Key 假設你有以下兩個 SSH key 文件: 第一個賬號:id_rsa(默認)第二個賬號:id_rsa_github ? 步驟:在 Windows 上配置多個 GitHub 賬號 SSH Key 1?? 打開 SSH 配…

技術選型:時序數據庫(三)

IoTDB vs InfluxDB vs TDengine 時序數據庫橫評對比。 從 架構設計、性能、功能、生態、適用場景 等維度,對三款時序數據庫進行深度對比,助您精準選型。 一、核心架構對比 數據庫 存儲模型 數據模型 擴展性 Apache IoTDB 分層存儲(TsFi…

電子電路原理第十九章(非線性運算放大器電路的應用)

單片集成運算放大器價格便宜、用途廣泛且性能可靠。它們不僅可以用于線性電路,如電壓放大器、電流源和有源濾波器,而且可以用于非線性電路,如比較器、波形生成器和有源二極管電路。非線性運放電路的輸出通常與輸入信號的波形不同,這是因為運放在輸入周期的某個時間段內達到…

FPGA實現CameraLink視頻解碼轉SDI輸出,基于LVDS+GTX架構,提供2套工程源碼和技術支持

目錄 1、前言工程概述免責聲明 2、CameraLink協議理論學習3、相關方案推薦我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目FPGA實現CameraLink視頻編解碼方案本博已有的 SDI 編解碼方案 4、工程詳細設計方案工程設計原理框圖輸入CameraLink相機LVDS視頻解碼模塊LV…

戶外人像要怎么拍 ?

前言: ” 接上篇,培養你的眼力 - 攝影構圖,本文是整理自《美國紐約攝影學院 攝影教材》,第三單元 - 第9課 - 自然光,課后習題及解答。“ 1. 正面光產生無深淺反差的平面感覺。 理解這題,首先得明白什么是…

華為云Flexus+DeepSeek征文 | 華為云 ModelArts Studio 賦能高情商AI聊天助手:用技術構建有溫度的智能對話體驗

前言 華為云 ModelArts Studio 是基于 ModelArts 構建的一站式大模型即服務平臺(MaaS),可通過與開源 Agent 框架 Dify.AI 結合來開發對接 AI 聊天助手。 在打造 “高情商” 特性的過程中,華為云ModelArts Studio 的自定義提示詞…