代码改变世界

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

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

img

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 核心接口

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

核心调用链:

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 自定义事件

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 自定义监听器

@Component
public class MyCustomEventListener implements ApplicationListener<MyCustomEvent> {
  @Override
  public void onApplicationEvent(MyCustomEvent event) {
  System.out.println("收到事件: " + event.getMessage());
  }
  }

7.3 发布事件

@Autowired
private ApplicationEventPublisher publisher;
publisher.publishEvent(new MyCustomEvent(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

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

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

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

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

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

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

上一篇推荐链接
Java程序员快又扎实的学习路线点击该处自动跳转查看哦
一文读懂 AI点击该处自动跳转查看哦
一文读懂 服务器点击该处自动跳转查看哦
2024年创作回顾点击该处自动跳转查看哦
一文读懂 ESLint配置点击该处自动跳转查看哦
老鸟如何追求快捷操作电脑点击该处自动跳转查看哦
未来会写什么文章?预告链接
一文读懂 XX?点击该处自动跳转查看哦
2025年终总结点击该处自动跳转查看哦
一图读懂 XX?点击该处自动跳转查看哦

img