實現implements InitializingBean, DisposableBean 有什么用

在 Spring 框架中,實現 InitializingBeanDisposableBean 接口用于管理 Bean 的生命周期回調,分別控制 Bean 的初始化后銷毀前行為。具體作用如下:


1. InitializingBean 接口

public interface InitializingBean {void afterPropertiesSet() throws Exception;
}
  • ?作用?:在 Bean 的依賴注入完成后立即執行初始化邏輯
  • ?觸發時機?:當 Spring 完成以下步驟后調用:
    1. Bean 實例化(調用構造器)
    2. 注入所有依賴(通過 @Autowired 或 XML 配置)
    3. 完成其他屬性設置(如 @Value 注入)
  • ?典型用途?:
    • 數據校驗(檢查必要屬性是否注入)
    • 啟動后臺線程
    • 加載初始化數據(如緩存預熱)
    • 建立數據庫連接
public class DatabaseService implements InitializingBean {private DataSource dataSource;@Overridepublic void afterPropertiesSet() throws Exception {// 校驗必要依賴if (dataSource == null) {throw new IllegalStateException("DataSource 未注入!");}// 初始化連接池Connection conn = dataSource.getConnection();// ... 其他初始化操作}
}

2. DisposableBean 接口

public interface DisposableBean {void destroy() throws Exception;
}
  • ?作用?:在 Bean 銷毀前執行清理操作
  • ?觸發時機?:
    • 單例 Bean:Spring 容器關閉時(context.close()
    • 原型 Bean:Spring 不管理其銷毀,需手動觸發或依賴其他機制
  • ?典型用途?:
    • 關閉數據庫連接
    • 停止后臺線程
    • 釋放文件句柄或網絡資源
    • 發送銷毀通知日志
public class ResourceHolder implements DisposableBean {private Thread backgroundThread;@Overridepublic void destroy() throws Exception {// 安全停止線程backgroundThread.interrupt();// 釋放資源releaseFileHandles();}
}

為什么不推薦直接使用這兩個接口?

  1. ?侵入性強?:強制 Bean 實現 Spring 特定接口,導致代碼與 Spring 耦合。
  2. ?替代方案?:Spring 提供更靈活的、無侵入的生命周期管理方式:
    • ?初始化替代方案?:
      • @PostConstruct 注解
      • XML 配置中 init-method 屬性(如 <bean init-method="init">
      • Java 配置中 @Bean(initMethod = "customInit")
    • ?銷毀替代方案?:
      • @PreDestroy 注解
      • XML 配置中 destroy-method 屬性
      • @Bean(destroyMethod = "customCleanup")

生命周期回調順序示例

當使用多種初始化/銷毀方式時,執行順序如下:

public class ExampleBean implements InitializingBean, DisposableBean {// 構造器 -> 依賴注入 -> @PostConstruct -> afterPropertiesSet() -> 自定義init-method@PostConstructpublic void postConstruct() { /* 1st */ }@Overridepublic void afterPropertiesSet() { /* 2nd */ }public void customInit() { /* 3rd */ }// 銷毀順序:@PreDestroy -> destroy() -> 自定義destroy-method@PreDestroypublic void preDestroy() { /* 1st */ }@Overridepublic void destroy() { /* 2nd */ }public void customDestroy() { /* 3rd */ }
}

最佳實踐建議

  • ?優先使用無侵入方案?:用 @PostConstruct@PreDestroy 替代接口,降低框架耦合度。
  • ?需要細粒度控制時?:例如需要確保在依賴注入后立刻執行關鍵邏輯(早于其他初始化方法),可使用 afterPropertiesSet()
  • ?處理遺留代碼?:舊版 Spring 項目可能依賴這些接口,遷移時可逐步替換。

💡 ?總結?:InitializingBeanDisposableBean 是 Spring 生命周期管理的底層機制。現代 Spring 開發中,應優先選擇 @PostConstruct@PreDestroy 等解耦方案,但在需要精確控制執行順序的場景下仍可合理使用接口。

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

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

相關文章

GitLab 18.2 發布幾十項與 DevSecOps 有關的功能,可升級體驗【一】

沿襲我們的月度發布傳統&#xff0c;極狐GitLab 發布了 18.2 版本&#xff0c;該版本帶來了議題和任務的自定義工作流狀態、新的合并請求主頁、新的群組概覽合規儀表盤、下載安全報告的 PDF 導出文件、中心化的安全策略管理&#xff08;Beta&#xff09;等幾十個重點功能的改進…

如何快速把Clickhouse數據同步到Mysql

直接使用Clickhouse官方支持的Mysql引擎表的方式&#xff01; 一、首先創建Mysql引擎表&#xff1a; CREATE TABLE saas_analysis.t_page_view_new_for_write (id Int64,shop_id Nullable(Int64),session_id Nullable(String),client_id Nullable(String),one_id Nullable(Str…

Kafka 重復消費與 API 冪等消費解決方案

Kafka 是一個高性能的分布式消息系統&#xff0c;但消費者重啟、偏移量&#xff08;offset&#xff09;未正確提交或網絡問題可能導致重復消費。API 冪等性設計則用于防止重復操作帶來的副作用。本文從 Kafka 重復消費和 API 冪等性兩個方面提供解決方案&#xff0c;重點深入探…

win11推遲更新

1、按住WINR2、輸入以下命令&#xff1a;reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" /v FlightSettingsMaxPauseDays /t reg_dword /d 10000 /f3、點擊確定4、打開搜索框5、在搜索框里邊輸入更新&#xff0c;選擇檢查更新6、在暫停…

【uniapp】---- 使用 uniapp 實現視頻和圖片上傳且都可以預覽展示

1. 前言 接手得 uniapp 開發的微信小程序項目,新的開發需求是需要同時上傳圖片和視頻,但是之前的上傳都沒有進行封裝,都是每個頁面需要的時候單獨實現,現在新的需求,有多個地方都需要上傳圖片、視頻或語音等,這樣就需要封裝一個組件,然后發現部分地方使用了 uni-file-p…

(nice!!!) (LeetCode 每日一題) 2411. 按位或最大的最小子數組長度(位運算+滑動窗口)

2411. 按位或最大的最小子數組長度 思路&#xff1a;位運算滑動窗口&#xff0c;時間復雜度0(n*32)。 **遍歷每一個元素nums[i]&#xff0c;然后看能否改變它前面的元素nums[j]&#xff08; j<i &#xff09;&#xff0c; 當(nums[j]|nums[i])nums[j]時&#xff0c;說明當前…

算法競賽階段二-數據結構(36)數據結構雙向鏈表模擬實現

//#include<bits/stdc.h> #include<iostream> using namespace std; const int N1e510; //定義 int e[N],pre[N],ne[N],h,id; int mp[N]; //頭插 // 兵 y // x void push_front (int x) {id;e[id]x;mp[x]id;pre[id]h;ne[id]ne[h];//先修改新節點…

津發科技帶你了解皮膚電信號中的SCL與SCR

皮膚電&#xff08;Electrodermal Activity, EDA&#xff09;作為一種非常容易獲取的基本生理信號&#xff0c;可以很好地量化我們的情緒反應&#xff0c;被廣泛應用于情感識別研究中。它代表機體受到刺激時皮膚電傳導的變化。皮膚電反應作為交感神經系統功能的直接指標&#x…

spark的broadcast variables

在 Spark 中&#xff0c;廣播變量&#xff08;Broadcast Variables&#xff09; 是一種特殊類型的共享變量&#xff0c;用于高效地在集群中的所有節點間分發大型只讀數據集。它解決了 Spark 任務中頻繁傳輸重復數據的性能問題&#xff0c;特別適用于需要在多個任務中重用相同數…

Python爬蟲實戰:研究Haul庫相關技術構建電商數據采集與分析系統

1. 引言 1.1 研究背景與意義 隨著電子商務的迅速發展,電商平臺上的商品數據呈現爆炸式增長。這些數據蘊含著豐富的商業價值,如消費者行為分析、市場趨勢預測、競爭對手監測等。然而,如何從海量的電商數據中獲取有價值的信息,成為當前電商企業面臨的重要挑戰。 網絡爬蟲技…

Java:高頻面試知識分享1

一、Java 語言核心特性&#xff08;面向對象編程&#xff09;核心知識點梳理&#xff1a;面向對象三大特性&#xff1a;封裝&#xff1a;隱藏對象內部實現&#xff0c;通過 public 方法暴露接口&#xff08;例&#xff1a;類的 private 字段 get/set 方法&#xff09;。繼承&a…

MybatisPlus-核心功能

目錄 條件構造器 QueryWrapper UpdateWrapper LambdaQueryWrapper 自定義SQL 基本用法 多表關聯 Service接口 CRUD 基本用法 Lambda 批量新增 條件構造器 除了新增以外&#xff0c;修改、刪除、查詢的SQL語句都需要指定where條件。因此BaseMapper中提供的相關方法…

RHCE綜合項目:分布式LNMP私有博客服務部署

一、項目概述本次項目基于LNMP&#xff08;linux&#xff0c;nginx&#xff0c;mariadb&#xff0c;php&#xff09;搭建了一個私有的博客平臺&#xff0c;本篇博客詳細記錄了該博客平臺的服務部署全流程。在該項目中&#xff0c;使用了兩臺linux&#xff08;openeuler&#xf…

5種安全方法:如何刪除三星手機上的所有內容

隨著新的三星設備不斷推出&#xff0c;在出售或捐贈舊手機之前&#xff0c;徹底清除舊手機上的數據以保護隱私至關重要。許多人不知道的是&#xff0c;簡單的刪除操作并不能完全清除三星設備上的數據&#xff0c;被刪除的文件可能會處于不可見狀態。本文介紹了如何徹底刪除三星…

Vue 3 入門教程 2- Vue 組件基礎與模板語法

一、Vue 組件基礎在 Vue 中&#xff0c;組件是構建用戶界面的基本單位&#xff0c;它可以將頁面拆分成多個獨立、可復用的部分。一個 Vue 組件通常以 .vue 文件名結尾&#xff0c;包含三個核心部分&#xff1a;模板&#xff08;Template&#xff09;、腳本&#xff08;Script&a…

Linux 進程管理與計劃任務詳解

Linux 進程管理與計劃任務詳解 一、程序與進程的基本概念 程序&#xff1a;保存在外部存儲介質中的可執行機器代碼和數據的靜態集合&#xff0c;是靜態的文件實體進程&#xff1a;在 CPU 及內存中處于動態執行狀態的計算機程序&#xff0c;是程序的動態執行實例關聯關系&#x…

分層解耦(Controller,Service,Dao)

1. 三層架構核心職責層級職責說明關鍵技術 / 注解Controller&#xff08;控制器&#xff09;1. 接收前端請求&#xff08;HTTP&#xff09; 2. 封裝參數、校驗 3. 調用 Service 處理業務 4. 返回視圖 / 數據給前端Controller、GetMapping等Service&#xff08;業務層&#xff0…

鎂金屬接骨螺釘注冊檢測:骨科植入安全的科學基石

在骨科治療領域&#xff0c;鎂金屬接骨螺釘憑借其可降解性與生物相容性&#xff0c;成為傳統金屬植入物的革新替代方案。然而&#xff0c;作為Ⅲ類高風險無源植入器械&#xff08;分類編碼13-01-01&#xff09;&#xff0c;其注冊檢測需覆蓋生物相容性、化學表征、降解性能、力…

模具開發和管理系統(c#)

以前編寫的一個管理模具開發和進度的程序&#xff0c;可以跟蹤模具開發進度&#xff0c;可以查詢模具具體情況&#xff0c;也可以用水晶報表查詢。OS&#xff1a;microsoft windows IDE&#xff1a;microsoft visual studio programming language&#xff1a;C# DataBase&#…

【WRF-Chem 實例1】namelist.input 詳解- 模擬CO2

目錄 &time_control(時間控制) &physics(物理過程參數化方案) &fdda(四維數據同化) 工作機制簡述 &dynamics(WRF 動力核心的數值方法和選項) &bdy_control(邊界控制設置) &chem(WRF-Chem 主要化學設置) &namelist_quilt(并行 I/O 控制…