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

复制代码
博主社群介绍: ① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。
② 热榜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 生命周期与事件机制源码解析

目录

  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 容器生命周期主要阶段:

阶段 说明
初始化 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);
}

典型实现:

  • ConfigurationPropertiesBindingPostProcessor
  • AutowiredAnnotationBeanPostProcessor

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. 参考文档

结束语

👨‍💻 关于我

持续学习 | 追求真我

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

掘金点击访问Qiuner CSDN点击访问Qiuner GitHub点击访问Qiuner Gitee点击访问Qiuner

专栏 简介
📊 一图读懂系列 图文并茂,轻松理解复杂概念
📝 一文读懂系列 深入浅出,全面解析技术要点
🌟持续更新 保持学习,不断进步
🎯 人生经验 经验分享,共同成长

你好,我是Qiuner. 为帮助别人少走弯路而写博客

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

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

如果你遇到了问题,自己没法解决,可以去我掘金评论区问。CSDN评论区和私信消息看不完 掘金消息少一点.

上一篇推荐 链接
Java程序员快又扎实的学习路线 点击该处自动跳转查看哦
一文读懂 AI 点击该处自动跳转查看哦
一文读懂 服务器 点击该处自动跳转查看哦
2024年创作回顾 点击该处自动跳转查看哦
一文读懂 ESLint配置 点击该处自动跳转查看哦
老鸟如何追求快捷操作电脑 点击该处自动跳转查看哦
未来会写什么文章? 预告链接
一文读懂 XX? 点击该处自动跳转查看哦
2025年终总结 点击该处自动跳转查看哦
一图读懂 XX? 点击该处自动跳转查看哦
相关推荐
rabbit_pro1 小时前
Java 执行FFmpeg命令
java·开发语言·ffmpeg
李景琰1 小时前
JDK25 Scoped Values:为虚拟线程时代重构的线程上下文共享方案
java·jvm·重构
u***1371 小时前
Spring Cloud Gateway 整合Spring Security
java·后端·spring
听风吟丶1 小时前
Java 响应式编程实战:Spring WebFlux+Reactor 构建高并发电商系统
java·开发语言·spring
_院长大人_1 小时前
在 CentOS 系统上使用安装并用alternatives切换 JDK17(与 JDK8 共存指南)
java·linux·运维·centos
遇到困难睡大觉哈哈1 小时前
Harmony os——ArkTS 语言笔记(七):注解(Annotation)实战理解
java·笔记·ubuntu·harmonyos·鸿蒙
数新网络1 小时前
CyberAI多模态数据平台焕新升级!七大核心功能解锁高效管理新体验
java·网络·人工智能
Highcharts.js1 小时前
Renko Charts|金融图表之“砖形图”
java·前端·javascript·金融·highcharts·砖型图·砖形图
L***d6701 小时前
Spring Boot 经典九设计模式全览
java·spring boot·设计模式