Spring Bean生命周期七步曲:定義、實例化、初始化、使用、銷毀

各位小猿,程序員小猿開發筆記,希望大家共同進步。

引言

1.整體流程圖

在這里插入圖片描述

2.各階段分析

1??定義階段

1.1 定位資源

  • Spring 掃描 @Component@Service@Controller 等注解的類
  • 或解析 XML/Java Config 中的 Bean 定義

1.2定義 BeanDefinition

  • 解析類信息(作用域、懶加載、初始化/銷毀方法等)
  • 將解析結果封裝為 BeanDefinition 對象
  • 存儲到 BeanDefinitionRegistry (通常是 DefaultListableBeanFactory)

1.3發布到容器

  • BeanDefinition 注冊完成,但尚未實例化
  • 此時可通過 BeanFactory 獲取 Bean 的定義信息

發布,已經定義的bean到IOC容器中

1.4實例化bean

  • 容器通過反射調用構造函數創建原始對象
  • 若存在構造器依賴,優先解決循環依賴(三級緩存機制)

1.5完成相關依賴注入

  • 處理 @Autowired@Value@Resource 等注解
  • 填充普通屬性和集合類型

2??初始化

2.1setName方法

  • BeanNameAware.setBeanName()

2.2setBeanFactory

  • BeanFactoryAware.setBeanFactory()

2.3setApplicationContext

  • ApplicationContextAware.setApplicationContext()

2.4postProcessorBeforeInitislization()前置處理方法

  • BeanPostProcessor.postProcessBeforeInitialization()
  • 典型應用:@PostConstruct 注解處理、代理生成(如 AOP)

2.5調用 InitializingBean.afterPropertiesSet()

2.6執行自定義 init-method(XML 或 @Bean(initMethod)

2.6BeanPostProcessor 后置處理

  • BeanPostProcessor.postProcessAfterInitialization()
  • 典型應用:AOP 最終代理、監控增強

2.7postProcessorAfterInitislization()后置處理方法

3??準備使用

  • Bean 正式服務于應用程序
  • 所有依賴和方法均可正常使用

4??自定義銷毀方法

  1. 銷毀前置處理
    • DestructionAwareBeanPostProcessor.postProcessBeforeDestruction()
  2. 銷毀方法執行(按順序)
    • 調用 @PreDestroy 注解方法
    • 執行 DisposableBean.destroy()
    • 執行自定義 destroy-method(XML 或 @Bean(destroyMethod)
  3. 資源釋放
    • 斷開數據庫連接
    • 停止線程池
    • 釋放文件句柄等資源

3.注意事項

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;// 1. 定義 Bean 類(演示所有生命周期接口)
class ProductService implements BeanNameAware, BeanFactoryAware, ApplicationContextAware,InitializingBean, DisposableBean {private String productName;// 1.1 構造器(實例化階段)public ProductService() {System.out.println("🚀 1. 實例化階段: 調用構造器創建 ProductService 實例");}// 1.2 屬性注入(依賴注入階段)public void setProductName(String productName) {this.productName = productName;System.out.println("🔄 2. 依賴注入: setProductName() 注入屬性值: " + productName);}// 2.1 BeanNameAware 回調@Overridepublic void setBeanName(String name) {System.out.println("🔖 3.1 Aware 接口: setBeanName() → Bean ID: " + name);}// 2.2 BeanFactoryAware 回調@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println("🏭 3.2 Aware 接口: setBeanFactory() → BeanFactory 已注入");}// 2.3 ApplicationContextAware 回調@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {System.out.println("🌐 3.3 Aware 接口: setApplicationContext() → ApplicationContext 已注入");}// 2.4 自定義初始化方法 (通過 @Bean 指定)public void customInit() {System.out.println("🔧 5.1 初始化: 執行 @Bean 指定的 customInit()");}// 2.5 @PostConstruct 方法@PostConstructpublic void postConstructInit() {System.out.println("🔧 4.1 初始化: 執行 @PostConstruct 方法");}// 2.6 InitializingBean 接口@Overridepublic void afterPropertiesSet() {System.out.println("🔧 5.2 初始化: 執行 InitializingBean.afterPropertiesSet()");}// 3. 業務方法public void displayProduct() {System.out.println("🛒 6. 使用階段: 當前產品 → " + productName);}// 4.1 @PreDestroy 方法@PreDestroypublic void preDestroy() {System.out.println("?? 7.1 銷毀階段: 執行 @PreDestroy 方法");}// 4.2 DisposableBean 接口@Overridepublic void destroy() {System.out.println("?? 7.2 銷毀階段: 執行 DisposableBean.destroy()");}// 4.3 自定義銷毀方法 (通過 @Bean 指定)public void customDestroy() {System.out.println("?? 7.3 銷毀階段: 執行 @Bean 指定的 customDestroy()");}
}// 2. 自定義 BeanPostProcessor(演示擴展點)
class CustomBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof ProductService) {System.out.println("?? 4. 初始化前: BeanPostProcessor.postProcessBeforeInitialization()");}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (bean instanceof ProductService) {System.out.println("?? 5.3 初始化后: BeanPostProcessor.postProcessAfterInitialization()");}return bean;}
}// 3. Spring 配置類
@Configuration
class AppConfig {@Bean(initMethod = "customInit", destroyMethod = "customDestroy")public ProductService productService() {ProductService service = new ProductService();service.setProductName("iPhone 15"); // 屬性注入return service;}@Beanpublic CustomBeanPostProcessor customBeanPostProcessor() {return new CustomBeanPostProcessor();}
}// 4. 主應用類
public class BeanLifecycleDemo {public static void main(String[] args) {System.out.println("============ 啟動 Spring 容器 ============");AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);System.out.println("\n============ 使用階段 ============");ProductService productService = context.getBean(ProductService.class);productService.displayProduct();System.out.println("\n============ 關閉 Spring 容器 ============");context.close(); // 觸發銷毀階段}
}

輸出結果展示

============ 啟動 Spring 容器 ============
🚀 1. 實例化階段: 調用構造器創建 ProductService 實例
🔄 2. 依賴注入: setProductName() 注入屬性值: iPhone 15
🔖 3.1 Aware 接口: setBeanName() → Bean ID: productService
🏭 3.2 Aware 接口: setBeanFactory() → BeanFactory 已注入
🌐 3.3 Aware 接口: setApplicationContext() → ApplicationContext 已注入
?? 4. 初始化前: BeanPostProcessor.postProcessBeforeInitialization()
🔧 4.1 初始化: 執行 @PostConstruct 方法
🔧 5.1 初始化: 執行 @Bean 指定的 customInit()
🔧 5.2 初始化: 執行 InitializingBean.afterPropertiesSet()
?? 5.3 初始化后: BeanPostProcessor.postProcessAfterInitialization()============ 使用階段 ============
🛒 6. 使用階段: 當前產品 → iPhone 15============ 關閉 Spring 容器 ============
?? 7.1 銷毀階段: 執行 @PreDestroy 方法
?? 7.2 銷毀階段: 執行 DisposableBean.destroy()
?? 7.3 銷毀階段: 執行 @Bean 指定的 customDestroy()

生命周期階段詳解:

  1. 實例化階段
    • 調用構造函數創建 Bean 實例
  2. 依賴注入
    • 通過 setter 或字段注入屬性值
  3. Aware 接口回調(按順序)
    • BeanNameAwareBeanFactoryAwareApplicationContextAware
  4. 初始化前處理
    • BeanPostProcessor.postProcessBeforeInitialization()
  5. 初始化階段(按順序)
    • @PostConstruct 方法 → 自定義 init-methodInitializingBean.afterPropertiesSet()
  6. 初始化后處理
    • BeanPostProcessor.postProcessAfterInitialization()(如 AOP 代理在此生成)
  7. 使用階段
    • Bean 完全初始化,可被應用程序使用
  8. 銷毀階段(容器關閉時)
    • @PreDestroyDisposableBean.destroy() → 自定義 destroy-method

關鍵點說明:

  1. 執行順序:初始化方法按 @PostConstructInitializingBeaninit-method 順序執行
  2. 擴展點BeanPostProcessor 可干預初始化過程(如 AOP、事務代理)
  3. 銷毀順序:與初始化順序相反(棧結構)
  4. 作用域影響:原型(prototype) Bean 不執行銷毀方法?

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

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

相關文章

API安全監測工具:數字經濟的免疫哨兵

💥 企業的三重致命威脅 1. 漏洞潛伏的定時炸彈 某支付平臺未檢測出API的批量數據泄露漏洞,導致230萬用戶信息被盜,面臨GDPR 1.8億歐元罰單(IBM X-Force 2024報告)。傳統掃描器對邏輯漏洞漏檢率超40%(OWASP基…

Matplotlib詳細教程(基礎介紹,參數調整,繪圖教程)

目錄 一、初識Matploblib 1.1 安裝 Matplotlib 1.2、Matplotlib 的兩種接口風格 1.3、Figure 和 Axes 的深度理解 1.4 設置畫布大小 1.5 設置網格線 1.6 設置坐標軸 1.7 設置刻度和標簽 1.8 添加圖例和標題 1.9 設置中文顯示 1.10 調整子圖布局 二、常用繪圖教程 2…

Redis高可用架構演進面試筆記

1. 主從復制架構 核心概念Redis單節點并發能力有限,通過主從集群實現讀寫分離提升性能: Master節點:負責寫操作Slave節點:負責讀操作,從主節點同步數據 主從同步流程 全量同步(首次同步)建立連接…

無人機保養指南

定期清潔無人機在使用后容易積累灰塵、沙礫等雜物,需及時清潔。使用軟毛刷或壓縮空氣清除電機、螺旋槳和機身縫隙中的雜質。避免使用濕布直接擦拭電子元件,防止短路。電池維護鋰電池是無人機的核心部件,需避免過度放電或充電。長期存放時應保…

vlm MiniCPM 學習部署實戰

目錄 開源地址: 模型repo下載: 單圖片demo: 多圖推理demo: 論文學習筆記: 部署完整教程: 微調教程: 部署,微調教程,視頻實測 BitCPM4 技術報告 創意&#xff1…

92套畢業相冊PPT模版

致青春某大學同學聚會PPT模版,那些年我們一起走過的歲月PPT模版,某學院某班同學聯誼會PPT模版,匆匆那年PPT模版,青春的紀念冊PPT模版,梔子花開PPT模版,畢業紀念冊PPT模版。 92套畢業相冊PPT模版&#xff1…

爬蟲基礎概念

網絡爬蟲概述 概念 網絡爬蟲(Web Crawler),也稱為網絡蜘蛛(Web Spider)或機器人(Bot),是一種自動化程序,用于系統地瀏覽互聯網并收集網頁信息。它模擬人類瀏覽器行為&…

java8 stream流操作的flatMap

我們來詳細解釋一下 Java 8 Stream API 中的 flatMap 操作。理解 flatMap 的關鍵在于將其與 map 操作進行對比。??核心概念:????map 操作:??作用:將一個流中的每個元素??轉換??為另一個元素(類型可以不同)…

開源UI生態掘金:從Ant Design二次開發到行業專屬組件的技術變現

開源UI生態掘金:從Ant Design二次開發到行業專屬組件的技術變現內容摘要在開源UI生態中,Ant Design作為一款廣受歡迎的UI框架,為開發者提供了強大的基礎組件。然而,面對不同行業的特定需求,僅僅依靠現有的組件往往難以…

Object Sense (OSE):一款從編輯器腳本發展起來的編程語言

引言:從Vim編輯器走出的語言在編程語言的世界里,許多革命性的創新往往源于看似簡單的工具。Object Sense(簡稱OSE)的誕生,便與一款經典文本編輯器——Vim息息相關。它的前身是Vim的腳本語言VimL(Vimscript&…

我考PostgreSQL中級專家證書二三事

1. 為什么選擇PGCE?PostgreSQL的開源特性、高性能和高擴展性早已讓我心生向往,而PGCE認證不僅是對技術能力的認可,更是一張通往更高職業舞臺的“通行證”。官方資料提到,PGCE考試涵蓋性能優化、高可用架構、復雜查詢處理、內核原理…

Java 動態導出 Word 登記表:多人員、分頁、動態表格的最佳實踐

本文詳細講解如何使用 Java 動態導出包含多人員報名表的 Word 文檔,每人占據獨立一頁,并支持動態表格行(如個人經歷)。我們對比了多種實現方案,最終推薦基于 Freemarker XML 模板 或 docx4j 的靈活方式,并…

【element-ui el-table】多選表格勾選時默認勾選了全部,row-key綁定異常問題解決

項目場景: Element-UI的el-table組件row-key使用問題 同一個頁面使用了幾個table,這幾個table都使用了多選,row-key屬性,其中row-key的綁定方式都是用的靜態綁定,row-key“username”或row-key“id”,可正常…

C#注釋技巧與基礎編程示例

以下是一個包含基礎注釋的 C# 程序示例&#xff0c;展示了 C# 中各類注釋的使用方法&#xff1a;using System;namespace BasicCSharpProgram {/// <summary>/// Program 類是應用程序的入口點/// 包含 Main 方法作為程序執行的起點/// </summary>public class Pro…

極客大挑戰2019-HTTP

涵蓋知識&#xff1a;UA頭偽造漏洞&#xff1a;全稱&#xff1a;User-Agent 這個部分包含我們所使用的操作系統版本&#xff0c;cpu&#xff0c;瀏覽器類型等。來源偽造漏洞&#xff1a;在http請求頭中會攜帶一個Referer&#xff0c;這個用來表示服務器用戶是從哪個地方來的X-F…

談談ArrayList與Vector的理解?

目錄 擴容機制 ArrayList擴容源碼 Vector擴容源碼 二者區別 擴展&#xff1a;stack(棧&#xff09; 1.創建stack對象 2. 入棧(先進后出&#xff09; 3.出棧 擴展&#xff1a;舉個例子&#xff1a;實現下字符串逆置&#xff0c;利用stack棧來實現。 從接口實現上&#xff…

【Linux庖丁解牛】— 多線程同步 !

1. 什么是線程同步為什么會有線程同步&#xff0c;那一定是有了新問題。互斥可以解決臨界資源被同時訪問的問題&#xff0c;但是純互斥也會帶來新的問題。由于當前被執行的線程離cpu最近【其他線程被阻塞掛起還要被喚醒】&#xff0c;所以&#xff0c;當前進程對于競爭鎖天然就…

基于arduino uno r3主控的環境監測系統設計-1

準備設計arduino uno r3為主控的環境監測系統&#xff0c;通過傳感器采集TVOC&#xff08;總揮發性有機物&#xff09;、HCHO&#xff08;甲醛&#xff09;和eCO2&#xff08;等效二氧化碳&#xff09;數據&#xff0c;并顯示在LCD屏幕上&#xff0c;同時支持數據記錄到SD卡&am…

ITIL 4:云計算與微服務對組織架構的影響

這幾年&#xff0c;很多組織在推進數字化轉型時遇到一個共同的問題&#xff1a;業務節奏越來越快&#xff0c;但內部協作的“架構”卻越來越跟不上節奏。技術架構的變革&#xff0c;必須同步推動組織架構的重塑。特別是隨著云計算和微服務架構的廣泛應用&#xff0c;這種影響愈…

【Android】xml和Java兩種方式實現發送郵件頁面

三三要成為安卓糕手 一&#xff1a;xml中LinearLayout布局參數的使用 1&#xff1a;xml代碼 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http:/…