JAVA面試寶典 -《Spring IOC核心:Bean生命周期全解析》

文章目錄

  • 🌱 《Spring IOC核心:Bean生命周期全解析》
    • 1?? 引言:Bean 生命周期為什么重要?
    • 2?? Bean 生命周期概覽(圖示 + 簡要說明)
    • 3?? 每一步詳細解析(源碼理解 + 示例)
      • 3.1 🧱 實例化(構造函數)
      • 3.2 🧩 屬性注入(Setter、@Value、@Autowired)
      • 3.3 🔎 Aware 接口(Bean 開始“認識環境”)
      • 3.4 ?? 初始化階段(核心階段!)
        • ? 方式1:實現 InitializingBean
        • ? 方式2:使用 @PostConstruct
        • ? 方式3:init-method 配置(XML 或 @Bean)
        • ? BeanPostProcessor:初始化前后增強
      • 3.5 🧑?🔧 使用階段(容器托管中)
      • 3.6 💣 銷毀階段
        • ? 方式1:實現 DisposableBean
        • ? 方式2:使用 @PreDestroy
        • ? 方式3:destroy-method 配置
    • 4?? 實戰演示:一個 Bean 完整生命周期打印示例
    • 5?? 常見誤區與調試技巧
    • 6?? 總結 & 推薦實踐
    • 📘 延伸閱讀

🌱 《Spring IOC核心:Bean生命周期全解析》

目標讀者:
使用 Spring 的 Java 后端開發者,
想深入理解 Bean 的創建、初始化、銷毀全過程,
以寫出更加健壯、可控、可調試的應用代碼。


1?? 引言:Bean 生命周期為什么重要?

Bean,不是你 new 出來的,而是 Spring 創建并“托管”的!

在 Spring 框架中,Bean 是最核心的組件之一,但我們很多時候對它的 “出生 → 成長 → 退休” 過程了解得并不完整。

類比一下:
Spring 就像一個“高級托兒所”,Bean 是被托管的小朋友,從出生到離園都有嚴格的流程規范。

理解這個生命周期,不僅能幫助我們進行框架擴展、調試 Bug,更是理解 Spring “魔法”的第一步!


2?? Bean 生命周期概覽(圖示 + 簡要說明)

         ┌────────────┐│ 實例化 Instantiation└────┬───────┘↓┌────────┴────────┐│ 屬性填充 Populate│└────────┬────────┘↓┌────────────┴────────────┐│ Aware 回調(BeanNameAware等)└────────────┬────────────┘↓┌────────────┴────────────┐│ 初始化:@PostConstruct / init-method│ + BeanPostProcessor 執行└────────────┬────────────┘↓┌────────┴────────┐│  Bean 被使用中  │└────────┬────────┘↓┌────────────┴────────────┐│ 銷毀:@PreDestroy / destroy-method└─────────────────────────┘

3?? 每一步詳細解析(源碼理解 + 示例)

3.1 🧱 實例化(構造函數)

Spring 首先通過 構造函數反射 實例化 Bean。

public class MyBean {public MyBean() {System.out.println("1?? 實例化階段");}
}

3.2 🧩 屬性注入(Setter、@Value、@Autowired)

Spring 在實例化后,為 Bean 注入屬性。

@Component
public class MyBean {@Value("${my.value:default}")private String value;@Autowiredprivate Dependency dependency;public void setValue(String value) {System.out.println("2?? 屬性注入:" + value);this.value = value;}@Autowiredpublic void setDependency(Dependency dependency) {System.out.println("2?? 屬性注入:依賴注入完成");this.dependency = dependency;}
}

3.3 🔎 Aware 接口(Bean 開始“認識環境”)

Bean 想知道自己叫什么、誰在托管我、我在哪個容器中?就實現這些接口。

@Component
public class MyBean implements BeanNameAware, BeanFactoryAware, ApplicationContextAware {public void setBeanName(String name) {System.out.println("3?? BeanNameAware:我的名字是 " + name);}public void setBeanFactory(BeanFactory factory) {System.out.println("3?? BeanFactoryAware:我被 BeanFactory 托管");}public void setApplicationContext(ApplicationContext ctx) {System.out.println("3?? ApplicationContextAware:我已感知到容器");}
}

3.4 ?? 初始化階段(核心階段!)

Spring 讓你“準備就緒”,可以做初始化邏輯了。

? 方式1:實現 InitializingBean
@Override
public void afterPropertiesSet() throws Exception {System.out.println("4?? InitializingBean:屬性注入后初始化");
}
? 方式2:使用 @PostConstruct
@PostConstruct
public void init() {System.out.println("4?? @PostConstruct:初始化方法執行");
}
? 方式3:init-method 配置(XML 或 @Bean)
@Bean(initMethod = "init")
public MyBean myBean() {return new MyBean();
}
? BeanPostProcessor:初始化前后增強
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {public Object postProcessBeforeInitialization(Object bean, String name) {System.out.println("?? Before Init: " + name);return bean;}public Object postProcessAfterInitialization(Object bean, String name) {System.out.println("?? After Init: " + name);return bean;}
}

3.5 🧑?🔧 使用階段(容器托管中)

此階段 Bean 被容器管理、可被其他組件注入、調用。

@Component
public class UserService {@Autowiredprivate MyBean myBean;public void use() {System.out.println("5?? Bean 正在被使用中");}
}

3.6 💣 銷毀階段

Spring 容器關閉時,執行銷毀邏輯。

? 方式1:實現 DisposableBean
@Override
public void destroy() throws Exception {System.out.println("6?? DisposableBean:銷毀中");
}
? 方式2:使用 @PreDestroy
@PreDestroy
public void destroyMethod() {System.out.println("6?? @PreDestroy:銷毀邏輯");
}
? 方式3:destroy-method 配置
@Bean(destroyMethod = "cleanup")
public MyBean myBean() {return new MyBean();
}

?? 注意:@Scope(“prototype”) 的 Bean 容器不負責銷毀!需手動釋放資源。

4?? 實戰演示:一個 Bean 完整生命周期打印示例

@Component
public class LifeCycleBean implements BeanNameAware, InitializingBean, DisposableBean {public LifeCycleBean() {System.out.println("1?? 構造方法執行:實例化");}@Autowiredpublic void setDependency(Dependency dep) {System.out.println("2?? 屬性注入");}@Overridepublic void setBeanName(String name) {System.out.println("3?? 感知容器:我的名字是 " + name);}@PostConstructpublic void postConstruct() {System.out.println("4?? 初始化:@PostConstruct");}@Overridepublic void afterPropertiesSet() {System.out.println("4?? 初始化:afterPropertiesSet");}@PreDestroypublic void preDestroy() {System.out.println("6?? 銷毀:@PreDestroy");}@Overridepublic void destroy() {System.out.println("6?? 銷毀:destroy()");}
}

控制臺輸出:

1?? 構造方法執行:實例化
2?? 屬性注入
3?? 感知容器:我的名字是 lifeCycleBean
4?? 初始化:@PostConstruct
4?? 初始化:afterPropertiesSet
?? Bean 使用中...
6?? 銷毀:@PreDestroy
6?? 銷毀:destroy()

5?? 常見誤區與調試技巧

問題描述可能原因
@PostConstruct 不執行Bean 沒被容器管理,或被 @Configuration 注冊成了 Lite 模式
BeanPostProcessor 順序異常實現了多個 BPP 接口但未排序,可實現 Ordered 解決
原型 Bean 不執行 destroy@Scope("prototype") 的 Bean 不受容器銷毀管理
生命周期日志沒打印@Component 沒掃到;或被懶加載;或依賴未注入

6?? 總結 & 推薦實踐

  • Bean 生命周期是 Spring 提供擴展能力的核心入口;
  • 推薦使用 @PostConstruct 和 @PreDestroy 進行初始化/銷毀管理;
  • 多個初始化方式優先級為:@PostConstruct > InitializingBean > init-method;
  • 掌握 Bean 生命周期 = 掌握 Spring 魔法的第一步!

📘 延伸閱讀

  • Spring 源碼 AbstractBeanFactory
  • 《Spring 實戰》第 4 章 Bean 生命周期
  • 官方文檔:Bean Lifecycle

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

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

相關文章

Python 類型注解實戰:`Optional` 與安全數據處理的藝術

Python 類型注解實戰:Optional 與安全數據處理的藝術 在 Python 開發中,類型注解(Type Hints)已經成為現代 Python 項目的標配。本文將通過一個真實的認證令牌獲取函數 get_auth_token(),深入解析 Optional 類型的應用…

深入MyBatis:CRUD操作與高級查詢實戰

引言 在上一篇文章中,我們介紹了Mybatis的基礎使用。 如有需要請移步查看: MyBatis入門:快速掌握用戶查詢實戰https://blog.csdn.net/qq_52331401/article/details/149270402?spm1001.2014.3001.5502 今天,我將通過一個完整的…

Flink DataStream API詳解(二)

一、引言 咱兩書接上回,上一篇文章主要介紹了DataStream API一些基本的使用,主要是針對單數據流的場景下,但是在實際的流處理場景中,常常需要對多個數據流進行合并、拆分等操作,以滿足復雜的業務需求。Flink 的 DataS…

Unity3D游戲線上崩潰排查指南

前言 排查Unity3D線上游戲崩潰是個系統工程,需要結合工具鏈、日志分析和版本管理。以下是詳細的排查指南和關鍵步驟: 對惹,這里有一個游戲開發交流小組,希望大家可以點擊進來一起交流一下開發經驗呀! 一、崩潰信息收…

DPDK性能優化實踐:系統級性能調優的方法論與實戰(一套通用的方法論)

性能優化的挑戰與現實困境 在高性能網絡處理領域,性能優化往往被視為一門“玄學”而非科學。許多開發者在面對性能瓶頸時,要么盲目追求單一指標的極致優化,要么采用"試錯法"進行零散的局部調優,結果往往是投入大量精力卻…

Docker的/var/lib/docker/目錄占用100%的處理方法

文章目錄 一、問題描述 二、解決措施 三、可能遇到的問題 問題1、問題描述:執行 sudo systemctl stop docker 命令時,提示 Warning: Stopping docker.service, but it can still be activated by: docker.socket 問題2、問題描述:執行 s…

【UE教程/進階】Slate鏈式編輯原理

目錄鏈式編輯操作" . "操作" "操作" [ ] "鏈式編輯 SNew().[] 操作" . " SLATE_ARGUMENT(ArgType, ArgName) 宏 調用宏 SLATE_PRIVATE_ARGUMENT_VARIABLE(ArgType, ArgName) ,在FArgument結構體中添加了變量…

將手工建模模型(fbx、obj)轉換為3dtiles的免費工具!

文章目錄1、工具下載2、使用說明3、詳細說明命令行格式示例命令參數說明4、源碼地址1、工具下載 百度網盤下載鏈接 選擇最新版本下載即可,支持Linux和Windows系統 2、使用說明 1)按住鍵盤winr鍵,在彈出的窗口中輸入cmd 2)點擊…

FreeRTOS源碼學習之內核初始化

目錄 前言 一、主函數內容 二、osKernelInitialize ()內核初始化函數內容 三、IS_IRQ()宏定義中斷檢測函數內容 四、如果這篇文章能幫助到你,請點個贊鼓勵一下吧ξ( ?>??)~ 前言 使用STM32CubeMX添加FreeRTOS進入工程之后,會自動在ma…

Docker—— 鏡像構建原因

在現代軟件開發和運維中,Docker已成為一種非常流行的工具,它通過容器化應用程序來簡化部署過程。然而,默認的官方鏡像往往只能滿足基礎需求,無法涵蓋所有特定項目的具體要求。原因說明系統級改動無法通過 volume 實現修改用戶、刪…

鋰電池自動化生產線的現狀與發展

鋰電池自動化生產線的概述鋰電池自動化生產線是指采用自動化設備和控制系統,實現鋰電池從原材料到成品的全流程自動化生產過程。隨著新能源產業的快速發展,鋰電池作為重要的儲能元件,其生產制造技術也在不斷進步。自動化生產線通過減少人工干…

java底層的native和沙箱安全機制

沙箱安全機制沙箱(Sandbox)安全機制是一種將程序或代碼運行在隔離環境中的安全技術,旨在限制其對系統資源(如文件系統、網絡、內存、其他進程等)的訪問權限,從而降低潛在惡意代碼帶來的風險。其核心思想是“…

【分享】文件擺渡系統適配醫療場景:安全與效率兼得

根據國家信息安全相關法規要求,醫院為了網絡安全,大多會采用網閘等隔離手段,將網絡隔離為內網和外網,但網絡隔離后,醫院的內外網間仍存在較為頻繁的文件擺渡需求。文件擺渡系統則是可以解決跨網絡或跨安全域文件傳輸中…

vscode 中的 mermaid

一、安裝軟件 Mermaid preview Mermaid support 二、運行命令 創建.md 文件右鍵選擇 ?Open Preview?(或按 CtrlShiftV) 三、流程圖 注意: 要md 文件要保留 mermaid 1. #mermaid-svg-nchqbvlWePe5KCwJ {font-family:"trebuchet ms"…

微服務引擎 MSE 及云原生 API 網關 2025 年 6 月產品動態

點擊此處,了解微服務引擎 MSE 產品詳情。

【TCP/IP】7. IP 路由

7. IP 路由7. IP 路由概述7.1 直接傳遞與間接傳遞7.2 IP 路由核心機制7.3 路由表7.3.1 路由表的構成7.3.2 信宿地址采用網絡地址的好處7.3.3 下一跳地址的優勢7.3.4 特殊路由表項7.3.5 路由算法7.4 靜態路由7.4.1 特點7.4.2 自治系統(AS)7.4.3 配置命令7…

xFile:高性能虛擬分布式加密存儲系統——Go

xFile:高性能虛擬分布式加密存儲系統 目錄xFile:高性能虛擬分布式加密存儲系統1 背景介紹2 設計初衷與目標3 項目簡介4 系統架構5 核心優勢1. 真正的分布式塊存儲2. 塊級加密與壓縮,安全高效3. 靈活的索引與元數據管理4. 多用戶與權限體系5. …

時序數據庫:高效處理時間序列數據的核心技術

時序數據庫概述時序數據庫(Time Series Database,TSDB)是一種專門為存儲、處理和查詢時間序列數據而優化的數據庫系統。隨著物聯網、金融科技、工業互聯網等領域的快速發展,時序數據呈現出爆炸式增長,傳統的關系型數據…

面試官:你再問TCP三次握手,我就要報警了!

CP三次握手和四次揮手,是面試官最愛問的“開場白”之一 別看它基礎,真要講清楚細節,分分鐘讓你冷汗直流! 這玩意兒就跟程序員相親一樣: 表面上問的是“你老家哪的” 實際上是在試探你有沒有房、有沒有車、能不能落…

RuoYi+Uniapp(uni-ui)開發商城系統

如果你正在考慮用 RuoYi 和 UniApp(uni-ui)搭建一套商城系統,那這套組合確實值得好好研究。它整合了 RuoYi 的快速開發能力和 UniApp 的跨平臺特性,在高效開發的同時還能兼顧多端適配的需求。下面從技術架構、功能模塊、開發實踐到…