Spring Boot 机制三: ApplicationContext 生命周期与事件机制源码解析

Spring Boot 机制三: ApplicationContext 生命周期与事件机制源码解析
博主社群介绍: ① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。 ② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。 ③ 群内也有职场精英,大厂大佬,跨国企业主管,可交流技术、面试、找工作的经验。 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬,进群赠送ZEEKLOG评论防封脚本,送真活跃粉丝,助你提升文章热度。 群公告里还有全网大赛约稿汇总/博客提效工具集/ZEEKLOG自动化运营脚本 有兴趣的加文末联系方式,备注自己的ZEEKLOG昵称,拉你进群,互相学习共同进步。 

文章目录

Spring Boot 机制三: ApplicationContext 生命周期与事件机制源码解析

目录

  1. Spring Boot 启动概览
  2. ApplicationContext 生命周期概览
  3. BeanFactoryPostProcessor 与 BeanPostProcessor 调用顺序
  4. ApplicationEvent & ApplicationEventPublisher 源码解析
  5. Spring Boot 自带事件体系解析
  6. Mermaid 图:启动链 + 事件广播链
  7. 实战示例:自定义事件监听器
  8. 表格总结常见事件类型与触发时机
  9. 参考文档

1. Spring Boot 启动概览

Spring Boot 启动流程:

SpringApplication.run() → prepareEnvironment() → createApplicationContext() → prepareContext() → refreshContext() → finishRefresh() 

核心目标:

  • 初始化 Environment
  • 加载 PropertySource
  • 创建 ApplicationContext
  • 注册 BeanPostProcessor、BeanFactoryPostProcessor
  • 调用 ApplicationEventPublisher 广播事件

2. ApplicationContext 生命周期概览

Spring 容器生命周期主要阶段:

阶段说明
初始化 BeanFactoryBeanDefinition 加载到 BeanFactory
BeanFactoryPostProcessor 执行可修改 BeanDefinition
BeanPostProcessor 注册在 Bean 初始化前后插入拦截逻辑
ApplicationContext.refresh()核心启动方法,刷新容器
ApplicationEvent 发布各类事件依次广播
容器就绪ApplicationReadyEvent 发布

源码流程(简化 Mermaid 图):

SpringApplication.run()prepareEnvironment()createApplicationContext()prepareContext()refreshContext()finishRefresh()ApplicationReadyEvent 发布


3. BeanFactoryPostProcessor 与 BeanPostProcessor 调用顺序

3.1 BeanFactoryPostProcessor

  • 执行时机:ApplicationContext refresh 前
  • 作用:修改 BeanDefinition
for(BeanFactoryPostProcessor postProcessor :getPostProcessors()){ postProcessor.postProcessBeanFactory(beanFactory);}

典型实现:

  • ConfigurationPropertiesBindingPostProcessor
  • AutowiredAnnotationBeanPostProcessor

3.2 BeanPostProcessor

  • 执行时机:Bean 实例化后、初始化前后
  • 主要方法:
postProcessBeforeInitialization(Object bean,String beanName)postProcessAfterInitialization(Object bean,String beanName)

顺序表:

执行阶段BeanPostProcessor 功能
beforeInitialization注入代理、AOP 处理
afterInitialization初始化回调、装饰 Bean

4. ApplicationEvent & ApplicationEventPublisher 源码解析

4.1 核心接口

publicabstractclassApplicationEvent{privatefinallong timestamp =System.currentTimeMillis();}publicinterfaceApplicationEventPublisher{voidpublishEvent(ApplicationEvent event);voidpublishEvent(Object event);}

4.2 ApplicationEventPublisher 实现

Spring Boot 容器默认:

AbstractApplicationContext → ApplicationEventMulticaster → Listeners 

核心调用链:

applicationEventMulticaster.multicastEvent(event);for(ApplicationListener listener :getApplicationListeners(eventType)){ listener.onApplicationEvent(event);}

5. Spring Boot 自带事件体系解析

常用事件:

事件描述触发阶段
ApplicationStartingEventSpringApplication 开始run() 最开始
ApplicationEnvironmentPreparedEventEnvironment 已准备prepareEnvironment() 后
ApplicationContextInitializedEventApplicationContext 初始化prepareContext() 后
ApplicationPreparedEventApplicationContext 刷新前refreshContext() 前
ApplicationStartedEventApplicationContext 刷新后refreshContext() 后
ApplicationReadyEvent应用完全启动finishRefresh() 后
ApplicationFailedEvent启动失败异常捕获

6. Mermaid 图:启动链 + 事件广播链

SpringApplication.run()ApplicationStartingEvent 发布prepareEnvironment()ApplicationEnvironmentPreparedEvent 发布createApplicationContext()prepareContext()ApplicationContextInitializedEvent 发布refreshContext()ApplicationStartedEvent 发布finishRefresh()ApplicationReadyEvent 发布


7. 实战示例:自定义事件监听器

7.1 自定义事件

publicclassMyCustomEventextendsApplicationEvent{privatefinalString message;publicMyCustomEvent(Object source,String message){super(source);this.message = message;}publicStringgetMessage(){return message;}}

7.2 自定义监听器

@ComponentpublicclassMyCustomEventListenerimplementsApplicationListener<MyCustomEvent>{@OverridepublicvoidonApplicationEvent(MyCustomEvent event){System.out.println("收到事件: "+ event.getMessage());}}

7.3 发布事件

@AutowiredprivateApplicationEventPublisher publisher; publisher.publishEvent(newMyCustomEvent(this,"事件触发成功!"));

控制台输出:

收到事件: 事件触发成功! 

8. 表格总结常见事件类型与触发时机

事件触发阶段用途
ApplicationStartingEventSpringApplication.run() 开始日志/监控
ApplicationEnvironmentPreparedEventEnvironment 初始化完成自定义属性处理
ApplicationContextInitializedEventApplicationContext 创建完成注册 Bean
ApplicationPreparedEventrefresh 前容器准备完成
ApplicationStartedEventrefresh 后Bean 已初始化
ApplicationReadyEvent应用完全启动启动后逻辑
ApplicationFailedEvent启动失败异常处理

9. 参考文档

  • Spring Boot 官方事件文档
    https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.spring-application.events
  • ApplicationEvent Javadoc
    https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/ApplicationEvent.html
  • Spring Boot GitHub 源码
    https://github.com/spring-projects/spring-boot

结束语

👨‍💻 关于我

持续学习 | 追求真我

如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的。想看更多 那就点个关注吧 我会尽力带来有趣的内容 😎。

感谢订阅专栏 三连文章

image-20251011155556997

掘金点击访问QiunerZEEKLOG点击访问QiunerGitHub点击访问QiunerGitee点击访问Qiuner

专栏简介
📊 一图读懂系列图文并茂,轻松理解复杂概念
📝 一文读懂系列深入浅出,全面解析技术要点
🌟持续更新保持学习,不断进步
🎯 人生经验经验分享,共同成长
你好,我是Qiuner. 为帮助别人少走弯路而写博客

如果本篇文章帮到了你 不妨点个吧~ 我会很高兴的 😄 (^ ~ ^) 。想看更多 那就点个关注吧 我会尽力带来有趣的内容 😎。

代码都在Github或Gitee上,如有需要可以去上面自行下载。记得给我点星星哦😍

如果你遇到了问题,自己没法解决,可以去我掘金评论区问。ZEEKLOG评论区和私信消息看不完 掘金消息少一点.
上一篇推荐链接
Java程序员快又扎实的学习路线点击该处自动跳转查看哦
一文读懂 AI点击该处自动跳转查看哦
一文读懂 服务器点击该处自动跳转查看哦
2024年创作回顾点击该处自动跳转查看哦
一文读懂 ESLint配置点击该处自动跳转查看哦
老鸟如何追求快捷操作电脑点击该处自动跳转查看哦
未来会写什么文章?预告链接
一文读懂 XX?点击该处自动跳转查看哦
2025年终总结点击该处自动跳转查看哦
一图读懂 XX?点击该处自动跳转查看哦

Read more

Flutter 组件 cleany 适配鸿蒙 HarmonyOS 实战:自动化清理矩阵,构建复杂应用的状态闭环与资源防腐架构

Flutter 组件 cleany 适配鸿蒙 HarmonyOS 实战:自动化清理矩阵,构建复杂应用的状态闭环与资源防腐架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 cleany 适配鸿蒙 HarmonyOS 实战:自动化清理矩阵,构建复杂应用的状态闭环与资源防腐架构 前言 在鸿蒙(OpenHarmony)生态迈向多任务并行、长周期驻留及高频账户流转的全场景办公与生活背景下,如何确保应用在退出登录、环境切换或异常恢复时能够“不留痕迹”地销毁脏数据,已成为衡量应用健壮性的核心指标。在鸿蒙设备这类强调分布式沙箱隔离与严苛内存占用(Resident Set Size)管控的环境下,如果应用缺乏统一的资源清理机制,由于由于散落在各处的 Stream 监听、本地缓存及内存单例,极易由于由于状态残留导致不同用户间的数据越权或 UI 状态的逻辑死锁。 我们需要一种能够集中注册清理任务、支持并发异步销毁且具备原子性执行保障的状态复位框架。 cleany 为 Flutter 开发者引入了极其暴力且高效的“全域清算”范式。它通过中心化的管理器(Manager),允许各个业务模块在初始化时注册其对应的资源回收钩子。在适

By Ne0inhk
Spring Boot AOP(五) 高级特性与源码实践

Spring Boot AOP(五) 高级特性与源码实践

博主社群介绍: ① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。 ② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。 ③ 群内也有职场精英,大厂大佬,跨国企业主管,可交流技术、面试、找工作的经验。 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬,进群赠送ZEEKLOG评论防封脚本,送真活跃粉丝,助你提升文章热度。 群公告里还有全网大赛约稿汇总/博客提效工具集/ZEEKLOG自动化运营脚本 有兴趣的加文末联系方式,备注自己的ZEEKLOG昵称,拉你进群,互相学习共同进步。 文章目录 * Spring Boot AOP(五) 高级特性与源码实践 * 1. 高级特性概述 * 2. 自定义 Pointcut * Mermaid 图:自定义 Pointcut 匹配流程 * 3. 自定义 Advice

By Ne0inhk
Flutter 组件 meeting_place_core 的适配 鸿蒙Harmony 实战 - 驾驭分布式会议引擎、实现鸿蒙端高性能协作空间与复杂信令分发方案

Flutter 组件 meeting_place_core 的适配 鸿蒙Harmony 实战 - 驾驭分布式会议引擎、实现鸿蒙端高性能协作空间与复杂信令分发方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 meeting_place_core 的适配 鸿蒙Harmony 实战 - 驾驭分布式会议引擎、实现鸿蒙端高性能协作空间与复杂信令分发方案 前言 在后疫情时代的协同办公浪潮中,视频会议已经从单一的垂直应用演变为鸿蒙(OpenHarmony)生态中“泛在协作”的核心基础设施。当你在鸿蒙平板上开启一场跨国技术评审,或者在鸿蒙车机上紧急连线公司晨会时,支撑这一切流畅运行的,是底层极其复杂的会议核心引擎。 meeting_place_core 是一套工业级的、专为多端同步设计的会议核心抽象包。它不负责 UI 渲染,而是专注于房间管理(Room Management)、成员状态流转、信令推送及媒体流的逻辑编排。 适配到鸿蒙平台后,结合鸿蒙强大的分布式能力,meeting_place_core 能让你的 App 轻松实现“手机开会,大屏投映,

By Ne0inhk
Spring Cloud动态配置刷新:@RefreshScope与@Component的深度解析

Spring Cloud动态配置刷新:@RefreshScope与@Component的深度解析

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[[email protected]] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? * 专栏导航: 码农阿豪系列专栏导航 面试专栏:收集了java相关高频面试题,面试实战总结🍻🎉🖥️ Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用🚀🔧💻 Redis专栏:Redis从零到一学习分享,经验总结,案例实战💐📝💡 全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有🤸🌱🚀 目录 * Spring Cloud动态配置刷新:@RefreshScope与@Component的深度解析 * 引言 * 1. `@RefreshScope` 的作用与原理 * 1.1 什么是 `@RefreshScope`? * 1.

By Ne0inhk