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. 参考文档
- 结束语
Spring Boot 机制三: ApplicationContext 生命周期与事件机制源码解析
目录
- Spring Boot 启动概览
- ApplicationContext 生命周期概览
- BeanFactoryPostProcessor 与 BeanPostProcessor 调用顺序
- ApplicationEvent & ApplicationEventPublisher 源码解析
- Spring Boot 自带事件体系解析
- Mermaid 图:启动链 + 事件广播链
- 实战示例:自定义事件监听器
- 表格总结常见事件类型与触发时机
- 参考文档
1. Spring Boot 启动概览
Spring Boot 启动流程:
SpringApplication.run() → prepareEnvironment() → createApplicationContext() → prepareContext() → refreshContext() → finishRefresh() 核心目标:
- 初始化 Environment
- 加载 PropertySource
- 创建 ApplicationContext
- 注册 BeanPostProcessor、BeanFactoryPostProcessor
- 调用 ApplicationEventPublisher 广播事件
2. ApplicationContext 生命周期概览
Spring 容器生命周期主要阶段:
| 阶段 | 说明 |
|---|---|
| 初始化 BeanFactory | BeanDefinition 加载到 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);}典型实现:
ConfigurationPropertiesBindingPostProcessorAutowiredAnnotationBeanPostProcessor
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 自带事件体系解析
常用事件:
| 事件 | 描述 | 触发阶段 |
|---|---|---|
| ApplicationStartingEvent | SpringApplication 开始 | run() 最开始 |
| ApplicationEnvironmentPreparedEvent | Environment 已准备 | prepareEnvironment() 后 |
| ApplicationContextInitializedEvent | ApplicationContext 初始化 | prepareContext() 后 |
| ApplicationPreparedEvent | ApplicationContext 刷新前 | refreshContext() 前 |
| ApplicationStartedEvent | ApplicationContext 刷新后 | 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. 表格总结常见事件类型与触发时机
| 事件 | 触发阶段 | 用途 |
|---|---|---|
| ApplicationStartingEvent | SpringApplication.run() 开始 | 日志/监控 |
| ApplicationEnvironmentPreparedEvent | Environment 初始化完成 | 自定义属性处理 |
| ApplicationContextInitializedEvent | ApplicationContext 创建完成 | 注册 Bean |
| ApplicationPreparedEvent | refresh 前 | 容器准备完成 |
| ApplicationStartedEvent | refresh 后 | 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
结束语

👨💻 关于我
持续学习 | 追求真我
如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的。想看更多 那就点个关注吧 我会尽力带来有趣的内容 😎。
感谢订阅专栏 三连文章

掘金点击访问QiunerZEEKLOG点击访问QiunerGitHub点击访问QiunerGitee点击访问Qiuner
| 专栏 | 简介 |
|---|---|
| 📊 一图读懂系列 | 图文并茂,轻松理解复杂概念 |
| 📝 一文读懂系列 | 深入浅出,全面解析技术要点 |
| 🌟持续更新 | 保持学习,不断进步 |
| 🎯 人生经验 | 经验分享,共同成长 |
你好,我是Qiuner. 为帮助别人少走弯路而写博客
如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^) 。想看更多 那就点个关注吧 我会尽力带来有趣的内容 😎。
代码都在Github或Gitee上,如有需要可以去上面自行下载。记得给我点星星哦😍
如果你遇到了问题,自己没法解决,可以去我掘金评论区问。ZEEKLOG评论区和私信消息看不完 掘金消息少一点.
| 上一篇推荐 | 链接 |
|---|---|
| Java程序员快又扎实的学习路线 | 点击该处自动跳转查看哦 |
| 一文读懂 AI | 点击该处自动跳转查看哦 |
| 一文读懂 服务器 | 点击该处自动跳转查看哦 |
| 2024年创作回顾 | 点击该处自动跳转查看哦 |
| 一文读懂 ESLint配置 | 点击该处自动跳转查看哦 |
| 老鸟如何追求快捷操作电脑 | 点击该处自动跳转查看哦 |
| 未来会写什么文章? | 预告链接 |
|---|---|
| 一文读懂 XX? | 点击该处自动跳转查看哦 |
| 2025年终总结 | 点击该处自动跳转查看哦 |
| 一图读懂 XX? | 点击该处自动跳转查看哦 |