博主社群介绍: ① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。
② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。
③ 群内也有职场精英,大厂大佬,跨国企业主管,可交流技术、面试、找工作的经验。
进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬,进群赠送CSDN评论防封脚本,送真活跃粉丝,助你提升文章热度。
群公告里还有全网大赛约稿汇总/博客提效工具集/CSDN自动化运营脚本 有兴趣的加文末联系方式,备注自己的CSDN昵称,拉你进群,互相学习共同进步。
文章目录
- [Spring Boot 机制三: ApplicationContext 生命周期与事件机制源码解析](#Spring Boot 机制三: ApplicationContext 生命周期与事件机制源码解析)
- [1. Spring Boot 启动概览](#1. Spring Boot 启动概览)
- [2. ApplicationContext 生命周期概览](#2. ApplicationContext 生命周期概览)
- [3. BeanFactoryPostProcessor 与 BeanPostProcessor 调用顺序](#3. BeanFactoryPostProcessor 与 BeanPostProcessor 调用顺序)
-
- [3.1 BeanFactoryPostProcessor](#3.1 BeanFactoryPostProcessor)
- [3.2 BeanPostProcessor](#3.2 BeanPostProcessor)
- [4. ApplicationEvent & ApplicationEventPublisher 源码解析](#4. ApplicationEvent & ApplicationEventPublisher 源码解析)
-
- [4.1 核心接口](#4.1 核心接口)
- [4.2 ApplicationEventPublisher 实现](#4.2 ApplicationEventPublisher 实现)
- [5. Spring Boot 自带事件体系解析](#5. Spring Boot 自带事件体系解析)
- [6. Mermaid 图:启动链 + 事件广播链](#6. Mermaid 图:启动链 + 事件广播链)
- [7. 实战示例:自定义事件监听器](#7. 实战示例:自定义事件监听器)
-
- [7.1 自定义事件](#7.1 自定义事件)
- [7.2 自定义监听器](#7.2 自定义监听器)
- [7.3 发布事件](#7.3 发布事件)
- [8. 表格总结常见事件类型与触发时机](#8. 表格总结常见事件类型与触发时机)
- [9. 参考文档](#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
java
for (BeanFactoryPostProcessor postProcessor : getPostProcessors()) {
postProcessor.postProcessBeanFactory(beanFactory);
}
典型实现:
ConfigurationPropertiesBindingPostProcessorAutowiredAnnotationBeanPostProcessor
3.2 BeanPostProcessor
- 执行时机:Bean 实例化后、初始化前后
- 主要方法:
java
postProcessBeforeInitialization(Object bean, String beanName)
postProcessAfterInitialization(Object bean, String beanName)
顺序表:
| 执行阶段 | BeanPostProcessor 功能 |
|---|---|
| beforeInitialization | 注入代理、AOP 处理 |
| afterInitialization | 初始化回调、装饰 Bean |
4. ApplicationEvent & ApplicationEventPublisher 源码解析
4.1 核心接口
java
public abstract class ApplicationEvent {
private final long timestamp = System.currentTimeMillis();
}
public interface ApplicationEventPublisher {
void publishEvent(ApplicationEvent event);
void publishEvent(Object event);
}
4.2 ApplicationEventPublisher 实现
Spring Boot 容器默认:
AbstractApplicationContext → ApplicationEventMulticaster → Listeners
核心调用链:
java
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 自定义事件
java
public class MyCustomEvent extends ApplicationEvent {
private final String message;
public MyCustomEvent(Object source, String message) {
super(source);
this.message = message;
}
public String getMessage() { return message; }
}
7.2 自定义监听器
java
@Component
public class MyCustomEventListener implements ApplicationListener<MyCustomEvent> {
@Override
public void onApplicationEvent(MyCustomEvent event) {
System.out.println("收到事件: " + event.getMessage());
}
}
7.3 发布事件
java
@Autowired
private ApplicationEventPublisher publisher;
publisher.publishEvent(new MyCustomEvent(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
结束语

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

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