Spring的初始化鉤子

1. @PostConstruct

  • JSR-250 標準注解(不是 Spring 獨有),用來標記 Bean 初始化完成后要執行的方法。
  • 會在 Bean 的構造方法執行完、依賴注入完成后執行。

使用實例:

@Component
public class Demo {@PostConstructpublic void init() {System.out.println("PostConstruct執行");}
}

執行時機: Bean 構造 → 依賴注入 → @PostConstruct方法 → 初始化完成

2. InitializingBean (afterPropertiesSet)

  • Spring 提供的接口,只要實現了它,就必須實現afterPropertiesSet()方法。
  • afterPropertiesSet()在 Bean 的依賴注入完成后執行(和 @PostConstruct 類似,但優先級稍后一些)。

使用實例:

@Component
public class Demo implements InitializingBean {@Overridepublic void afterPropertiesSet() {System.out.println("afterPropertiesSet執行");}
}

執行時機: Bean 構造 → 依賴注入 → @PostConstructafterPropertiesSet

3. ApplicationListener

  • Spring 的事件監聽器機制的一部分,用于監聽 Spring 容器內發生的事件(如 ContextRefreshedEvent、ApplicationReadyEvent 等)。
  • 可以實現 ApplicationListener 或使用 @EventListener 注解。

示例:監聽 ContextRefreshedEvent

@Component
public class Demo implements ApplicationListener<ContextRefreshedEvent> {@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {System.out.println("ApplicationListener執行");}
}

執行時機:

  • ContextRefreshedEvent:Spring 容器初始化或刷新完成后發布,通常用于監聽上下文準備完畢(比 CommandLineRunner 更早一點)。
  • ApplicationReadyEvent:Spring Boot 特有,表示整個 Spring Boot 應用完全啟動(更接近 CommandLineRunner)。

4. CommandLineRunner

  • Spring Boot 提供的接口。實現后會在整個 Spring 容器啟動完成(所有 Bean 初始化結束)之后執行。
  • 用來執行一些項目啟動后的邏輯,比如初始化數據、打印信息。

使用示例:

@Component
public class Demo implements CommandLineRunner {@Overridepublic void run(String... args) {System.out.println("CommandLineRunner執行");}
}

執行時機: Spring 容器完全啟動 → run 方法執行 → 也就是在所有 @PostConstruct、InitializingBean 執行完之后

5. Bean生命周期(Spring容器級別)

  • 實例化(Instantiation):Spring 通過反射調用構造方法,創建 Bean 實例。
  • 屬性填充(Dependency Injection):Spring 把依賴(@Autowired@Value@Resource等)注入到 Bean 里。
  • BeanPostProcessor 前置處理(postProcessBeforeInitialization):Spring 會調用注冊的所有 BeanPostProcess 的 postProcessBeforeInitialization()@PostConstruct的執行就是這里觸發的:CommonAnnotationBeanPostProcessor 負責找出@PostConstruct并執行。
  • 初始化(InitializingBean、init-method):如果實現了InitializingBean,調用afterPropertiesSet()。如果在@Bean(initMethod="xxx")指定了初始化方法,也會執行。
  • BeanPostProcessor 后置處理(postProcessAfterInitialization):再次調用注冊的 BeanPostProcessor 的 postProcessAfterInitialization()。比如 AOP、代理包裝,就是這一步做的。
  • Bean 就緒,可使用:到這里,這個 Bean 就放到 Spring 容器里了,可以被別的 Bean 使用。
實例化 ? 依賴注入 ? postProcessBeforeInitialization? @PostConstruct
? InitializingBean.afterPropertiesSet()
? init-method
? postProcessAfterInitialization
? 可用

6. SpringBoot 的啟動時間線(整個應用級別)

  • SpringApplication.run()啟動入口:創建ApplicationContext (即Spring容器)。
  • 準備環境(ApplicationEnvironmentPreparedEvent):配置文件、屬性源準備好。
  • 容器初始化(ApplicationPreparedEvent):ApplicationContext已經創建,但 Bean 還沒加載。
  • Bean 加載 → Bean 生命周期
  • 容器刷新完成(ContextRefreshedEvent):所有 Bean 都加載完成。可以用ApplicationListener<ContextRefreshedEvent>在這里干事。
  • ApplicationStartedEvent:Spring 容器準備好,還沒執行 CommandLineRunner / ApplicationRunner
  • 執行 CommandLineRunner / ApplicationRunner:所有事件都發完,啟動邏輯完成。
  • ApplicationReadyEvent:SpringBoot 應用準備就緒,可以對外提供服務了。
SpringApplication.run() ? 加載環境 (EnvironmentPrepared)? 創建容器 (Prepared)? Bean 生命周期 (實例化 ? @PostConstruct ? afterPropertiesSet)? 容器刷新完成 (ContextRefreshedEvent)? ApplicationStartedEvent? CommandLineRunner / ApplicationRunner? ApplicationReadyEvent

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

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

相關文章

【AI】Java生態對接大語言模型:主流框架深度解析

文章目錄1. Deep Java Library (DJL)2. LangChain4j&#xff08;LLM&#xff09;3. HuggingFace Inference API4. OpenAI Java Client技術對比矩陣架構設計建議在人工智能浪潮下&#xff0c;大語言模型&#xff08;LLM&#xff09;已成為技術核心。Java生態通過以下框架實現高效…

【06】C#入門到精通——C# 多個 .cs文件項目 同一項目下添加多個 .cs文件

文章目錄1 單個 .cs文件2 創建 多個 .cs文件2.1 添加Hero類2.1 添加ShowInfo類2.3 關于命名空間的引用2.4 所有.cs文件代碼3 test3項目文件下載1 單個 .cs文件 上一講中 描述游戲中英雄的角色 所有代碼在一個.cs文件中&#xff0c; 如果代碼很多&#xff0c;類很多&#xff0…

【MySQL基礎篇】:MySQL常用數據類型的選擇邏輯與正確使用

?感謝您閱讀本篇文章&#xff0c;文章內容是個人學習筆記的整理&#xff0c;如果哪里有誤的話還請您指正噢? ? 個人主頁&#xff1a;余輝zmh–CSDN博客 ? 文章所屬專欄&#xff1a;MySQL篇–CSDN博客 文章目錄數據類型1.數據類型分類2.數值類型int整形類型bit位類型float小…

三、搭建springCloudAlibaba2021.1版本分布式微服務-springcloud loadbalancer負載均衡

什么是負責均衡 Spring Cloud LoadBalancer是一個客戶端負載均衡器&#xff0c;類似于Ribbon&#xff0c;但是由于Ribbon已經進入維護模式&#xff0c;并且Ribbon 2并不與Ribbon 1相互兼容&#xff0c;所以Spring Cloud全家桶在Spring Cloud Commons項目中&#xff0c;添加了Sp…

Oracle不完全恢復實戰指南:從原理到操作詳解

核心提示&#xff1a;當誤刪表、日志損壞或控制文件丟失時&#xff0c;Oracle的不完全恢復是DBA最后的救命稻草。掌握關鍵恢復技術&#xff0c;可在數據災難中力挽狂瀾。一、不完全恢復核心概念 1. 核心特點 必須關閉數據庫&#xff1a;在MOUNT狀態下執行重做日志恢復權限要求&…

Linux之shell腳本篇(二)

一、shell編程之if語句引言Linux在shell編程中&#xff0c;通常都是以自上而下運行&#xff0c;但是為了提高其代碼嚴謹性&#xff0c;我們即引入了多條件 控制語句例如&#xff1a;if、for、while、case等語句&#xff0c;有時候針對條件我們還會結合正則表達式去運用。將這些…

如何在android framewrok dump camera data

實現dump 函數 實現1 void dumpBufferToFile(buffer_handle_t* buffer, int width, int height, int frameNum) {void* data NULL;GraphicBufferMapper::getInstance().lock(*buffer, GRALLOC_USAGE_SW_READ_OFTEN, Rect(width, height), &data);char filename[128];sprin…

機器學習中的可解釋性:深入理解SHAP值及其應用

機器學習可解釋性的重要性在人工智能技術快速發展的2025年&#xff0c;機器學習模型已經深度滲透到醫療診斷、金融風控、司法量刑等關鍵領域。然而&#xff0c;隨著模型復雜度的不斷提升&#xff0c;一個根本性矛盾日益凸顯&#xff1a;模型預測性能的提升往往以犧牲可解釋性為…

.NET9 使用 OData 協議項目實戰

.NET 中 ODate 協議介紹 OData(Open Data Protocol) 是一個開放的 Web 協議&#xff0c;用于查詢和更新數據。在 .NET 生態系統中&#xff0c;OData 被廣泛支持和使用。 主要特性 1. 統一的數據訪問方式 提供標準化的查詢語法支持 CRUD 操作支持元數據描述 2. 查詢能力 標…

Android 性能優化:提升應用啟動速度(GC抑制)

前言 在移動應用開發領域&#xff0c;啟動速度是用戶體驗的重要指標。對于Android應用而言&#xff0c;垃圾回收&#xff08;Garbage Collection, GC&#xff09;機制雖然是內存管理的核心&#xff0c;但在應用啟動期間頻繁觸發GC會顯著拖慢啟動速度。本文將深入探討如何通過GC…

做了一款小而美的本地校驗器

需求說明 前陣子收到一則讀者留言&#xff0c;指出&#xff1a;市面上AI核稿工具&#xff08;ProWritingAid&#xff0c;WPS AI Spell Check&#xff0c;Writer&#xff0c;QuillBot&#xff0c;Grammarly&#xff09;要么收費太高&#xff0c;要么讓人擔心文章泄露。 如下圖所…

uniapp + uview-plus 微信小程序二維碼生成和保存完整解決方案

uniapp + uview-plus 微信小程序二維碼生成和保存完整解決方案 ?? 項目背景 在開發微信小程序時,經常需要實現二維碼的生成和保存功能。本文檔提供了一個基于 uniapp + uview-plus 框架的完整解決方案,徹底解決了以下常見問題: ? Canvas API 兼容性問題 ? 微信小程序權…

Linux中應用程序的安裝于管理

Linux中應用程序的安裝于管理 一 . rpm安裝 1.掛載 光驅里面存放了很多rpm的軟件包 光驅在系統中使用時&#xff0c;需要掛載 mount /dev/cdrom /mnt/ cd /mnt[rootstw mnt]# ls CentOS_BuildTag GPL LiveOS RPM-GPG-KEY-CentOS-7 EFI images Packag…

mysql重置密碼

要區分 MySQL 是通過 systemd 還是傳統 service 管理&#xff0c;以及對應的密碼重置方案&#xff0c;可按以下步驟操作&#xff1a; 一、如何區分管理方式&#xff08;systemd 還是傳統 service&#xff09; 通過以下命令判斷系統默認的服務管理方式&#xff1a;檢查系統是否使…

C++ TAP(基于任務的異步編程模式)

&#x1f680; C TAP&#xff08;基于任務的異步編程模式&#xff09;1. 引言&#xff1a;走進異步編程新時代&#xff08;&#x1f680;&#xff09; 在當今高性能計算領域&#xff0c;同步編程模型的局限性日益凸顯。傳統的回調地獄和線程管理復雜性促使微軟提出了基于任務的…

利用C++手撕棧與隊列的基本功能(四)

棧和隊列詳細教程可以觀看 https://www.bilibili.com/video/BV1nJ411V7bd?spm_id_from333.788.videopod.episodes&vd_sourcedaed5b8a51d3ab7eb209efa9d0ff9a34&p48棧和隊列概念 棧和隊列是限定插入和刪除只能在表的端點進行的線性表在裝電池、裝彈夾、拿放盤子時都會出…

net8.0一鍵創建支持(Redis)

Necore項目生成器 - 在線創建Necore模板項目 | 一鍵下載 RedisController.cs using CSRedis; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using UnT.Template.Application.Responses; using UnT.Template.Domain;namespace UnT.Template.Controllers {…

Leetcode——42. 接雨水

還記得第一次見該題根本無從下手。其實&#xff0c;我們不妨把問題拆解&#xff0c;簡單化。不要怕自己寫的是暴力算法&#xff0c;有很多算法技巧其實就是在暴力算法的基礎上優化得來。題目目的是求所有可接雨水數量&#xff0c;我們可以求出每一個位置可接雨水數量&#xff0…

Go 語言-->指針

Go 語言–>指針 它允許你操作內存中的實際數據&#xff0c;而不僅僅是數據的副本。指針存儲的是另一個變量的內存地址&#xff0c;而不是變量的實際值。 1. 什么是指針 指針是存儲變量內存地址的變量&#xff0c;它指向另一個變量。通過指針&#xff0c;你可以間接地訪問和修…

軟工八將:軟件開發全流程核心角色體系解析

軟工八將&#xff1a;軟件開發全流程核心角色體系解析 作者注&#xff1a;本概念是由大學生董翔提出&#xff0c;具有一些影響意義。 在現代軟件開發領域&#xff0c;團隊角色的專業化分工是產品成功的核心保障。“軟工八將”作為一套系統梳理軟件開發全流程核心角色的術語&…