【Spring篇】Spring的生命周期

一、Bean 生命周期的核心階段

1. 實例化(Instantiation)

? 觸發時機:容器啟動時(單例 Bean)或請求時(原型 Bean)。
? 實現方式
通過反射(Class.newInstance() 或構造器)創建 Bean 的實例。

2. 屬性賦值(Population)

? 依賴注入
通過字段注入(@Autowired)、Setter 注入或構造器注入為 Bean 的屬性賦值。
? 處理 Aware 接口
若 Bean 實現了 BeanNameAwareBeanFactoryAware 等接口,容器會回調對應方法。

public class MyBean implements BeanNameAware {private String beanName;@Overridepublic void setBeanName(String name) {this.beanName = name; // 獲取 Bean 的名稱}
}
3. BeanPostProcessor 的前置處理

? 調用 postProcessBeforeInitialization
在 Bean 初始化前執行自定義邏輯(如修改 Bean 屬性)。

public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) {// 對 Bean 進行前置處理return bean;}
}
4. 初始化(Initialization)

? @PostConstruct 注解方法
標記在方法上,容器會調用該方法。

@PostConstruct
public void init() {// 初始化邏輯
}

? InitializingBean 接口
實現 afterPropertiesSet() 方法。

public class MyBean implements InitializingBean {@Overridepublic void afterPropertiesSet() {// 屬性賦值完成后執行}
}

? XML 配置的 init-method
在 XML 中指定初始化方法。

<bean id="myBean" class="com.example.MyBean" init-method="customInit"/>
5. BeanPostProcessor 的后置處理

? 調用 postProcessAfterInitialization
在 Bean 初始化后執行自定義邏輯(如生成代理對象)。

@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {// 對 Bean 進行后置處理(如 AOP 代理)return bean;
}
6. Bean 就緒(In Use)

? 業務使用階段
Bean 被應用程序代碼調用,執行業務邏輯。

7. 銷毀(Destruction)

? @PreDestroy 注解方法
標記在方法上,容器銷毀前調用。

@PreDestroy
public void cleanup() {// 釋放資源邏輯
}

? DisposableBean 接口
實現 destroy() 方法。

public class MyBean implements DisposableBean {@Overridepublic void destroy() {// 容器銷毀時執行}
}

? XML 配置的 destroy-method
在 XML 中指定銷毀方法。

<bean id="myBean" class="com.example.MyBean" destroy-method="customDestroy"/>

二、生命周期的完整流程圖

實例化 → 屬性賦值 → BeanPostProcessor前置處理 → 初始化 → BeanPostProcessor后置處理 → 使用 → 銷毀

三、擴展點與高級特性

1. Aware 接口

? 作用:讓 Bean 感知容器環境。
? 常見接口
? BeanNameAware:獲取 Bean 的名稱。
? BeanFactoryAware:獲取 BeanFactory 引用。
? ApplicationContextAware:獲取 ApplicationContext 引用。

2. BeanPostProcessor

? 核心用途
在 Bean 初始化前后插入自定義邏輯(如 AOP 代理、屬性加密)。
? 典型場景
Spring AOP 通過 AbstractAutoProxyCreator(BeanPostProcessor 的子類)生成代理對象。

3. BeanFactoryPostProcessor

? 作用
在 Bean 定義加載后、實例化前修改 Bean 的定義(如修改屬性值)。

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {BeanDefinition beanDef = beanFactory.getBeanDefinition("myBean");beanDef.getPropertyValues().add("property", "newValue");}
}
4. 作用域對生命周期的影響

? 單例(Singleton)
容器啟動時創建,容器關閉時銷毀。
? 原型(Prototype)
每次請求時創建,容器不管理其銷毀。
? 其他作用域
? Request/Session(Web 環境):生命周期與請求或會話綁定。
? 自定義作用域:通過 Scope 接口擴展。


四、示例代碼:完整生命周期演示

1. Bean 類
public class LifecycleBean implements BeanNameAware, InitializingBean, DisposableBean {private String beanName;@Overridepublic void setBeanName(String name) {this.beanName = name; // BeanNameAware 回調}@PostConstructpublic void postConstruct() {System.out.println("@PostConstruct 方法調用");}@Overridepublic void afterPropertiesSet() {System.out.println("InitializingBean.afterPropertiesSet() 調用");}public void customInit() {System.out.println("XML init-method 調用");}@PreDestroypublic void preDestroy() {System.out.println("@PreDestroy 方法調用");}@Overridepublic void destroy() {System.out.println("DisposableBean.destroy() 調用");}public void customDestroy() {System.out.println("XML destroy-method 調用");}
}
2. BeanPostProcessor
public class CustomBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) {if (bean instanceof LifecycleBean) {System.out.println("BeanPostProcessor.postProcessBeforeInitialization() 調用");}return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) {if (bean instanceof LifecycleBean) {System.out.println("BeanPostProcessor.postProcessAfterInitialization() 調用");}return bean;}
}
3. 輸出結果
實例化 LifecycleBean
BeanNameAware.setBeanName() 調用
BeanPostProcessor.postProcessBeforeInitialization() 調用
@PostConstruct 方法調用
InitializingBean.afterPropertiesSet() 調用
XML init-method 調用
BeanPostProcessor.postProcessAfterInitialization() 調用
...(Bean 使用階段)...
@PreDestroy 方法調用
DisposableBean.destroy() 調用
XML destroy-method 調用

五、總結

  1. 核心階段:實例化 → 屬性注入 → 初始化 → 銷毀。
  2. 關鍵擴展點
    ? Aware 接口(獲取容器信息)。
    ? BeanPostProcessor(初始化前后處理)。
    ? @PostConstruct/@PreDestroy(注解回調)。
    ? InitializingBean/DisposableBean(接口回調)。
  3. 作用域影響:單例和原型 Bean 的生命周期差異。
  4. 設計思想:通過回調接口和擴展點實現松耦合和可定制化。

通過掌握 Bean 的生命周期,可以更好地利用 Spring 的擴展能力(如自定義初始化、資源管理),同時避免因生命周期管理不當導致的資源泄漏或狀態錯誤。

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

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

相關文章

Redis、Memcached應用場景對比

環境 Redis官方網站&#xff1a; Redis - The Real-time Data Platform Redis社區版本下載地址&#xff1a;Install Redis | Docs Memcached官方網站&#xff1a;memcached - a distributed memory object caching system Memcached下載地址&#xff1a;memcached - a dis…

kettle插件-mysql8數據庫插件

場景&#xff1a;群里有小伙伴反饋kettle 7.x版本不能自動連接mysql8&#xff0c;安排&#xff01;&#xff01;&#xff01; 1、將mysql8的驅動包mysql-connector-java-8.0.20.jar丟到kettle的lib目錄下&#xff0c;重啟spoon。 2、配置數據庫連接&#xff0c;提示驅動類不對…

【軟件測試】:軟件測試實戰

1. ?動化實施步驟 1.1 編寫web測試?例 1.2 ?動化測試腳本開發 common public class AutotestUtils {public static EdgeDriver driver;// 創建驅動對象public static EdgeDriver createDriver(){// 驅動對象已經創建好了 / 沒有創建if( driver null){driver new EdgeDr…

深度學習入門1 基于Python的理論與實現

torch.unsqueeze()將一維數據變為二維數據&#xff0c;torch只能處理二維數據 tensor不能反向&#xff0c;variable可以反向。variable.data.numpy()轉換為numpy 第3章 神經網絡 實現softmax函數時的注意事項&#xff1a;為防止e的指數運算造成溢出 矩陣的第 0 維是列方向,第…

解決 Pentaho Kettle 插件集成中的 NoSuchMethodError: ContextFactory.enterContext() 錯誤

解決 Pentaho Kettle 插件集成中的 NoSuchMethodError: ContextFactory.enterContext() 錯誤 在使用 Pentaho Data Integration&#xff08;也稱為 Kettle&#xff09;進行數據集成和ETL開發時&#xff0c;開發者可能會遇到各種依賴沖突和技術挑戰。本文將詳細介紹一個常見的錯…

第 五 章:優化算法_《C++性能優化指南》_notes

優化算法 第五章重難點詳解與代碼實戰編譯與測試說明第五章核心知識點整理重難點梳理 第一部分&#xff1a;多選題&#xff08;10道&#xff09;第二部分&#xff1a;設計題&#xff08;5道&#xff09;答案與詳解多選題答案&#xff1a; 設計題參考實現&#xff08;以題目2為例…

多版本PHP開發環境配置教程:WAMPServer下MySQL/Apache/MariaDB版本安裝與切換

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、版本切換指南總結 前言 由于有幾個項目分別使用到PHP7.0 和7.4以及8.0版本&#xff0c;設置mysql也會根據PHP版本使用不同的版本&#xff0c;于是開始研究…

2024年數維杯數學建模C題天然氣水合物資源量評價解題全過程論文及程序

2024年數維杯數學建模 C題 天然氣水合物資源量評價 原題再現&#xff1a; 天然氣水合物&#xff08;Natural Gas Hydrate/Gas Hydrate&#xff09;即可燃冰&#xff0c;是天然氣與水在高壓低溫條件下形成的類冰狀結晶物質&#xff0c;因其外觀像冰&#xff0c;遇火即燃&#…

階段一:Java基礎語法

目標&#xff1a;掌握Java的基本語法&#xff0c;理解變量、數據類型、運算符、控制結構等。 1. Java開發環境搭建 安裝JDK配置環境變量編寫第一個Java程序 代碼示例&#xff1a; // HelloWorld.java public class HelloWorld { // 定義類名為 HelloWorldpublic static vo…

從0到1,解鎖Ant Design X的無限可能

Ant Design X 是什么&#xff1f; 在人工智能飛速發展的當下&#xff0c;AI 驅動的界面已成為軟件開發的重要趨勢。而 Ant Design X 正是順應這一趨勢&#xff0c;于 2024 年應運而生的一款遵循 Ant Design 設計體系的 React UI 庫&#xff0c;它旨在幫助開發者輕松打造 AI 驅…

Graphpad Prism for Mac醫學繪圖

Graphpad Prism for Mac醫學繪圖 文章目錄 Graphpad Prism for Mac醫學繪圖一、介紹二、效果三、下載 一、介紹 GraphPad Prism for Mac是一款功能強大、易于使用的科學和統計分析軟件&#xff0c;適用于各種類型的數據處理和可視化需求。無論您是進行基礎研究、臨床試驗還是學…

mysqloracledb2 (uuid函數)

項目場景&#xff1a; 創建一個32位的UUID 問題描述 原因分析&#xff1a; 解決方案&#xff1a; mysql內置UUID函數 SELECT UUID(); SELECT UUID_SHORT();oracle內置UUID函數 SELECT sys_guid() FROM dual;db2&#xff0c;模擬UUID函數 SELECT TEST || substr (CONCAT…

Android實踐開發制作小猴子摘桃小游戲

Android實踐制作小猴子摘桃小游戲 實踐素材項目源文件獲取&#xff1a;Android可能存在版本差異項目如果不能正確運行&#xff0c;可以使用里面的素材自己構建項目Android實踐制作小猴子摘桃小游戲Android實踐制作小猴子摘桃小游戲https://mp.weixin.qq.com/s/jNU_hVfj9xklsil…

Postman 下載文件指南:如何請求 Excel/PDF 文件?

在 Postman 中進行 Excel/PDF 文件的請求下載和導出&#xff0c;以下是簡明的步驟&#xff0c;幫助你輕松完成任務。首先&#xff0c;我們將從新建接口開始&#xff0c;逐步引導你完成整個過程。 Postman 請求下載/導出 excel/pdf 文件教程

重要重要!!fisher矩陣是怎么計算和更新的,以及計算過程中參數的物理含義

fisher矩陣是怎么計算和更新的,以及計算過程中參數的物理含義 Fisher信息矩陣(Fisher Information Matrix, FIM)用于衡量模型參數估計的不確定性,其計算和更新在統計學、機器學習和優化中具有重要作用。以下是其計算和更新的關鍵步驟: 一、Fisher矩陣的計算 定義 Fisher…

21.Excel自動化:如何使用 xlwings 進行編程

一 將Excel用作數據查看器 使用 xlwings 中的 view 函數。 1.導包 import datetime as dt import xlwings as xw import pandas as pd import numpy as np 2.view 函數 創建一個基于偽隨機數的DataFrame&#xff0c;它有足夠多的行&#xff0c;使得只有首尾幾行會被顯示。 df …

Elasticsearch客戶端工具初探--kibana

1 Kibana簡介 Kibana是Elastic Stack&#xff08;ELK&#xff09;中的可視化工具&#xff0c;用于對Elasticsearch中存儲的數據進行搜索、分析和可視化展示。它提供了直觀的Web界面&#xff0c;支持日志分析、業務監控、數據探索等功能&#xff0c;廣泛應用于運維監控、安全分析…

珍珠港海軍造船廠的“水魔法”:PcVue賦能造船心臟

導讀 項目背景 干船塢運作與控制需求 PcVue SCADA 系統的引入以及系統升級 項目成果 憑借更高的安全性&#xff0c;PcVue 對干船塢的充水和排水過程進行精準控制。 項目背景 珍珠港海軍基地與希卡姆空軍基地均依托這座歷史悠久的港口而發展&#xff0c;該港口在夏威夷原住…

3. 軸指令(omron 機器自動化控制器)——>MC_GearInPos

機器自動化控制器——第三章 軸指令 17 MC_GearInPos變量?輸入變量?輸出變量?輸入輸出變量 功能說明?時序圖?重啟運動指令?多重啟動運動指令?異常 示例程序?動作示例?梯形圖?結構文本(ST) MC_GearInPos 設定主軸和從軸間的齒輪比&#xff0c;進行電子齒輪動作。 指定…

vue 加載動態效果,自行封裝組件

背景&#xff1a; 在項目開發中&#xff0c;會請求接口&#xff0c;就會遇到加載中、加載成功、加載失敗、和加載成功但暫無數據等情況。就自行封裝了一個加載組件。采用vue3elementsetup組合式寫法。 實現效果&#xff1a; 封裝組件&#xff1a; //封裝組件 <template>…