各大框架如何监听Spring Boot八大启动事件源码级详细讲解结合上一轮8个启动事件顺序按基础内置框架 → Spring Cloud微服务生态 → 中间件ORM/缓存/消息 → 监控运维框架分类逐个说明每个框架监听哪个事件、做了什么核心逻辑、扩展原理。一、Spring Boot 框架自身内置监听器最底层Spring Boot 原生自带多个SPI加载的监听器全程驱动启动流程全部基于ApplicationListener实现SPI文件META-INF/spring.factories自动注册。1. ApplicationStartingEvent启动最开始监听框架LoggingApplicationListener核心行为扫描classpath自动识别日志实现优先级Logback Log4j2 JUL提前初始化日志上下文加载logback-spring.xml/log4j2.xml打印启动Banner、启动参数日志意义容器还没创建必须在最早阶段初始化日志否则后续启动无输出日志FileEncodingApplicationListener校验系统文件编码强制UTF-8编码异常直接阻断启动。2. ApplicationEnvironmentPreparedEvent环境配置就绪这是监听数量最多的事件几乎所有配置类框架都卡在这一步ConfigFileApplicationListenerSpringBoot核心配置加载器加载application.yml/application.properties、多环境application-dev.yml把配置注入Environment属性源是所有配置的入口EnvironmentPostProcessorApplicationListener统一调度所有EnvironmentPostProcessor后置处理器Nacos、Spring Cloud Config、Apollo配置中心全部通过它扩展拉远程配置BootstrapApplicationListenerSpring Cloud专属内置Spring Cloud最优先级监听器加载bootstrap.yml优先级高于application启动Bootstrap上下文提前初始化配置中心客户端保证远程配置优先加载本地配置BackgroundPreinitializer后台异步预初始化Jackson、ConversionService、字符转换器缩短主线程启动耗时。3. ApplicationContextInitializedEvent上下文创建完毕无BeanSpringBoot内置无大量业务监听器主要留给三方扩展允许三方注册ApplicationContextInitializer修改上下文参数、注册BeanDefinition扫描规则例如自定义包扫描、动态注册配置类、设置ApplicationContext环境变量4. ApplicationPreparedEventBean定义加载完成未实例化ConfigFileApplicationListener二次处理绑定ConfigurationProperties配置类配置中心补充把远程配置二次合并到上下文属性源三方框架MyBatis、Druid在此阶段注册Bean定义、解析mapper扫描路径5. ContextRefreshedEventSpring原生事件容器刷新完成单例Bean全部实例化Spring上下文核心刷新完成事件所有Bean已经Autowired、PostConstruct执行完毕内置PropertySourcesPlaceholderConfigurer完成占位符${xxx}替换所有中间件连接池、数据库连接、Redis客户端全部初始化完成6. ApplicationStartedEvent容器刷新后Runner执行前SpringBoot内置启动计时标记、生命周期回调触发三方用来做轻量初始化不会阻塞请求就绪。7. ApplicationReadyEvent应用完全就绪Tomcat启动、可接收请求SpringBoot内置打印Started XApplication in X seconds启动成功日志微服务注册、监控上报、缓存预热全部集中在此。8. ApplicationFailedEvent启动异常LoggingApplicationListener打印完整异常堆栈日志所有三方框架关闭已创建的资源数据库连接、Nacos长连接、线程池扩展发送失败告警、记录启动失败埋点二、Spring Cloud 微服务全家桶高频使用启动事件1. Nacos配置中心注册中心1配置模块监听ApplicationEnvironmentPreparedEvent实现类NacosConfigEnvironmentProcessor被EnvironmentPostProcessorApplicationListener调度执行逻辑读取bootstrap/application里spring.cloud.nacos.config地址、分组、命名空间远程拉取配置把Nacos配置塞入Environment属性源优先级高于本地yml开启配置监听长连接后续热更新2注册模块监听ApplicationReadyEvent实现NacosAutoServiceRegistration逻辑必须等Tomcat端口启动、应用完全就绪后才向Nacos注册实例状态UP如果提前注册网关会转发空请求到未就绪服务2. EurekaNetflix注册中心注册逻辑EurekaAutoServiceRegistration监听ApplicationReadyEvent原理容器刷新、Tomcat启动完毕后才调用Eureka Client发起注册启动失败时监听ApplicationFailedEvent取消注册/清理实例3. Spring Cloud Config 配置中心BootstrapApplicationListener在ApplicationEnvironmentPreparedEvent阶段创建bootstrap上下文拉取Git远程配置逻辑和Nacos一致4. OpenFeign / LoadBalancerContextRefreshedEventBean刷新完成后扫描FeignClient接口动态生成代理BeanApplicationReadyEvent初始化负载均衡节点列表、预热服务实例缓存5. Spring Cloud GatewayContextRefreshedEvent加载路由配置、实例化Filter、PredicateApplicationReadyEvent启动Netty服务注册网关实例到注册中心6. Sentinel 流量防护ApplicationEnvironmentPreparedEvent读取sentinel配置、控制台地址ContextRefreshedEvent初始化流量规则、埋点切面、线程池ApplicationReadyEvent连接Sentinel控制台上报应用状态7. Spring Cloud Bus配置总线ApplicationReadyEvent连接RabbitMQ/Kafka订阅配置刷新Topic监听全局配置变更三、ORM、数据库、连接池框架1. MyBatis / MyBatis-PlusApplicationPreparedEventMybatisAutoConfiguration读取mybatis.mapper-locations、typeAliases注册Mapper扫描BeanDefinitionContextRefreshedEvent实例化SqlSessionFactory、Mapper代理对象、分页插件、全局拦截器此时数据源连接池已经就绪不会用ApplicationReadyEvent数据库连接必须在Bean阶段就绪否则业务Bean注入Mapper报错2. Druid 数据库连接池ApplicationEnvironmentPreparedEvent解析druid连接地址、账号、监控配置ContextRefreshedEvent初始化连接池、创建监控Servlet、Wall防火墙配置3. Sharding-JDBC 分库分表ApplicationEnvironmentPreparedEvent加载分片规则、数据源列表ContextRefreshedEvent初始化多数据源、SQL解析引擎、分片算法Bean4. Flyway / Liquibase 数据库版本迁移ContextRefreshedEvent是标准监听点Bean刷新完成、数据源初始化完毕后自动执行SQL迁移脚本绝对不能放在更早事件此时数据源还没实例化四、缓存、消息中间件1. RedisSpring Data Redis / RedissonApplicationEnvironmentPreparedEvent读取redis地址、密码、集群配置ContextRefreshedEvent创建Redis连接池、RedissonClient实例、序列化器业务扩展常用ApplicationReadyEvent做缓存预热框架自身不做业务自定义监听2. RabbitMQ / RocketMQ / KafkaApplicationEnvironmentPreparedEvent解析Broker地址、队列、交换机、消费者组ContextRefreshedEvent创建连接工厂、生产者实例ApplicationReadyEvent启动消费者监听核心框架设计逻辑等应用完全能接收HTTP请求后再开始消费消息避免服务还没就绪就收到消息导致处理失败、消息堆积3. XXL-Job 定时任务ApplicationReadyEvent启动调度器、注册执行器到调度中心如果在ContextRefreshedEvent启动任务可能Bean还没完全初始化任务执行空指针。五、监控、运维、安全框架1. Spring Boot Actuator 健康监控ContextRefreshedEvent注册所有健康指标DB、Redis、Disk、注册中心ApplicationReadyEvent标记健康状态为UP暴露/actuator端点2. Prometheus / Micrometer 埋点监控ContextRefreshedEvent初始化指标Registry、Meter埋点ApplicationReadyEvent启动监控推送线程、上报应用启动耗时3. Spring Security 安全框架ContextRefreshedEvent加载SecurityFilterChain、权限规则、密码编码器、JWT过滤器4. Apollo 配置中心同NacosApplicationEnvironmentPreparedEvent阶段拉远程配置通过EnvironmentPostProcessor扩展Environment六、各个事件的框架使用汇总对照表启动事件主要使用框架 核心作用ApplicationStartingEventSpringBoot Logging、编码校验仅极早期底层初始化ApplicationEnvironmentPreparedEventNacos/Config/Apollo、Bootstrap上下文、配置文件加载、日志配置、Druid分片配置ApplicationContextInitializedEvent三方自定义上下文初始化、BeanDefinition预注册ApplicationPreparedEventMyBatis Mapper扫描、配置属性绑定、Bean定义装载ContextRefreshedEvent数据库连接池、Redis、Security、Feign代理、Flyway迁移、所有单例Bean实例化ApplicationStartedEvent轻量状态打点、内部生命周期回调ApplicationReadyEventNacos/Eureka服务注册、MQ消费者启动、定时任务启动、缓存预热、监控上报、启动成功通知ApplicationFailedEvent全框架资源释放、异常日志打印、失败告警、注册中心下线实例七、框架通用扩展原理为什么都用这套事件SPI机制大部分底层监听器在spring.factories配置SpringBoot启动自动实例化不需要Component时序强依赖配置类必须早于容器创建 → 绑定EnvironmentPreparedEventBean实例化必须在ContextRefreshedEvent对外注册、消费必须等服务完全可用 → ApplicationReadyEvent容错隔离启动失败事件统一回收资源避免连接泄漏、脏注册实例扩展一致性所有三方框架统一接入Spring事件标准不用各自实现一套启动生命周期。八、业务开发参考模仿框架设计规范配置解密、动态配置 → 监听ApplicationEnvironmentPreparedEvent数据库初始化脚本、自定义Bean装配 →ContextRefreshedEvent服务注册、消息消费、缓存预热、钉钉启动通知 →ApplicationReadyEvent失败告警、资源关闭 →ApplicationFailedEvent极早期启动参数校验 →ApplicationStartingEvent必须用addListeners注册EventListener抓不到代码示例监听所有事件可直接复制方式 1使用 EventListener 注解最简单importorg.springframework.boot.context.event.*;importorg.springframework.context.event.ContextRefreshedEvent;importorg.springframework.context.event.EventListener;importorg.springframework.stereotype.Component;ComponentpublicclassBootAllEventListener{EventListener(ApplicationStartingEvent.class)publicvoidonStart(){System.out.println(1. 应用开始启动);}EventListener(ApplicationEnvironmentPreparedEvent.class)publicvoidonEnvPrepared(){System.out.println(2. 环境配置已加载);}EventListener(ApplicationContextInitializedEvent.class)publicvoidonContextInit(){System.out.println(3. 容器初始化完成);}EventListener(ApplicationPreparedEvent.class)publicvoidonContextPrepared(){System.out.println(4. 容器准备完成Bean未加载);}EventListener(ContextRefreshedEvent.class)publicvoidonContextRefreshed(){System.out.println(5. 容器刷新完成Bean已加载);}EventListener(ApplicationStartedEvent.class)publicvoidonStarted(){System.out.println(6. 应用已启动);}EventListener(ApplicationReadyEvent.class)publicvoidonReady(){System.out.println(7. 应用就绪可以接收请求);// 这里写启动后必执行逻辑服务注册、缓存预热等}EventListener(ApplicationFailedEvent.class)publicvoidonFailed(){System.err.println(8. 应用启动失败);}}方式 2实现 ApplicationListener 接口早期事件必须用这个ApplicationStartingEvent 等早期事件EventListener 抓不到必须用如下方式importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.boot.context.event.ApplicationStartingEvent;importorg.springframework.context.ApplicationListener;SpringBootApplicationpublicclassDemoApplication{publicstaticvoidmain(String[]args){SpringApplicationappnewSpringApplication(DemoApplication.class);// 注册早期事件监听器app.addListeners((ApplicationListenerApplicationStartingEvent)event-{System.out.println(早期事件应用启动中);});app.run(args);}}
【各大框架如何监听 Spring Boot 八大启动事件(源码级详细讲解)】
各大框架如何监听Spring Boot八大启动事件源码级详细讲解结合上一轮8个启动事件顺序按基础内置框架 → Spring Cloud微服务生态 → 中间件ORM/缓存/消息 → 监控运维框架分类逐个说明每个框架监听哪个事件、做了什么核心逻辑、扩展原理。一、Spring Boot 框架自身内置监听器最底层Spring Boot 原生自带多个SPI加载的监听器全程驱动启动流程全部基于ApplicationListener实现SPI文件META-INF/spring.factories自动注册。1. ApplicationStartingEvent启动最开始监听框架LoggingApplicationListener核心行为扫描classpath自动识别日志实现优先级Logback Log4j2 JUL提前初始化日志上下文加载logback-spring.xml/log4j2.xml打印启动Banner、启动参数日志意义容器还没创建必须在最早阶段初始化日志否则后续启动无输出日志FileEncodingApplicationListener校验系统文件编码强制UTF-8编码异常直接阻断启动。2. ApplicationEnvironmentPreparedEvent环境配置就绪这是监听数量最多的事件几乎所有配置类框架都卡在这一步ConfigFileApplicationListenerSpringBoot核心配置加载器加载application.yml/application.properties、多环境application-dev.yml把配置注入Environment属性源是所有配置的入口EnvironmentPostProcessorApplicationListener统一调度所有EnvironmentPostProcessor后置处理器Nacos、Spring Cloud Config、Apollo配置中心全部通过它扩展拉远程配置BootstrapApplicationListenerSpring Cloud专属内置Spring Cloud最优先级监听器加载bootstrap.yml优先级高于application启动Bootstrap上下文提前初始化配置中心客户端保证远程配置优先加载本地配置BackgroundPreinitializer后台异步预初始化Jackson、ConversionService、字符转换器缩短主线程启动耗时。3. ApplicationContextInitializedEvent上下文创建完毕无BeanSpringBoot内置无大量业务监听器主要留给三方扩展允许三方注册ApplicationContextInitializer修改上下文参数、注册BeanDefinition扫描规则例如自定义包扫描、动态注册配置类、设置ApplicationContext环境变量4. ApplicationPreparedEventBean定义加载完成未实例化ConfigFileApplicationListener二次处理绑定ConfigurationProperties配置类配置中心补充把远程配置二次合并到上下文属性源三方框架MyBatis、Druid在此阶段注册Bean定义、解析mapper扫描路径5. ContextRefreshedEventSpring原生事件容器刷新完成单例Bean全部实例化Spring上下文核心刷新完成事件所有Bean已经Autowired、PostConstruct执行完毕内置PropertySourcesPlaceholderConfigurer完成占位符${xxx}替换所有中间件连接池、数据库连接、Redis客户端全部初始化完成6. ApplicationStartedEvent容器刷新后Runner执行前SpringBoot内置启动计时标记、生命周期回调触发三方用来做轻量初始化不会阻塞请求就绪。7. ApplicationReadyEvent应用完全就绪Tomcat启动、可接收请求SpringBoot内置打印Started XApplication in X seconds启动成功日志微服务注册、监控上报、缓存预热全部集中在此。8. ApplicationFailedEvent启动异常LoggingApplicationListener打印完整异常堆栈日志所有三方框架关闭已创建的资源数据库连接、Nacos长连接、线程池扩展发送失败告警、记录启动失败埋点二、Spring Cloud 微服务全家桶高频使用启动事件1. Nacos配置中心注册中心1配置模块监听ApplicationEnvironmentPreparedEvent实现类NacosConfigEnvironmentProcessor被EnvironmentPostProcessorApplicationListener调度执行逻辑读取bootstrap/application里spring.cloud.nacos.config地址、分组、命名空间远程拉取配置把Nacos配置塞入Environment属性源优先级高于本地yml开启配置监听长连接后续热更新2注册模块监听ApplicationReadyEvent实现NacosAutoServiceRegistration逻辑必须等Tomcat端口启动、应用完全就绪后才向Nacos注册实例状态UP如果提前注册网关会转发空请求到未就绪服务2. EurekaNetflix注册中心注册逻辑EurekaAutoServiceRegistration监听ApplicationReadyEvent原理容器刷新、Tomcat启动完毕后才调用Eureka Client发起注册启动失败时监听ApplicationFailedEvent取消注册/清理实例3. Spring Cloud Config 配置中心BootstrapApplicationListener在ApplicationEnvironmentPreparedEvent阶段创建bootstrap上下文拉取Git远程配置逻辑和Nacos一致4. OpenFeign / LoadBalancerContextRefreshedEventBean刷新完成后扫描FeignClient接口动态生成代理BeanApplicationReadyEvent初始化负载均衡节点列表、预热服务实例缓存5. Spring Cloud GatewayContextRefreshedEvent加载路由配置、实例化Filter、PredicateApplicationReadyEvent启动Netty服务注册网关实例到注册中心6. Sentinel 流量防护ApplicationEnvironmentPreparedEvent读取sentinel配置、控制台地址ContextRefreshedEvent初始化流量规则、埋点切面、线程池ApplicationReadyEvent连接Sentinel控制台上报应用状态7. Spring Cloud Bus配置总线ApplicationReadyEvent连接RabbitMQ/Kafka订阅配置刷新Topic监听全局配置变更三、ORM、数据库、连接池框架1. MyBatis / MyBatis-PlusApplicationPreparedEventMybatisAutoConfiguration读取mybatis.mapper-locations、typeAliases注册Mapper扫描BeanDefinitionContextRefreshedEvent实例化SqlSessionFactory、Mapper代理对象、分页插件、全局拦截器此时数据源连接池已经就绪不会用ApplicationReadyEvent数据库连接必须在Bean阶段就绪否则业务Bean注入Mapper报错2. Druid 数据库连接池ApplicationEnvironmentPreparedEvent解析druid连接地址、账号、监控配置ContextRefreshedEvent初始化连接池、创建监控Servlet、Wall防火墙配置3. Sharding-JDBC 分库分表ApplicationEnvironmentPreparedEvent加载分片规则、数据源列表ContextRefreshedEvent初始化多数据源、SQL解析引擎、分片算法Bean4. Flyway / Liquibase 数据库版本迁移ContextRefreshedEvent是标准监听点Bean刷新完成、数据源初始化完毕后自动执行SQL迁移脚本绝对不能放在更早事件此时数据源还没实例化四、缓存、消息中间件1. RedisSpring Data Redis / RedissonApplicationEnvironmentPreparedEvent读取redis地址、密码、集群配置ContextRefreshedEvent创建Redis连接池、RedissonClient实例、序列化器业务扩展常用ApplicationReadyEvent做缓存预热框架自身不做业务自定义监听2. RabbitMQ / RocketMQ / KafkaApplicationEnvironmentPreparedEvent解析Broker地址、队列、交换机、消费者组ContextRefreshedEvent创建连接工厂、生产者实例ApplicationReadyEvent启动消费者监听核心框架设计逻辑等应用完全能接收HTTP请求后再开始消费消息避免服务还没就绪就收到消息导致处理失败、消息堆积3. XXL-Job 定时任务ApplicationReadyEvent启动调度器、注册执行器到调度中心如果在ContextRefreshedEvent启动任务可能Bean还没完全初始化任务执行空指针。五、监控、运维、安全框架1. Spring Boot Actuator 健康监控ContextRefreshedEvent注册所有健康指标DB、Redis、Disk、注册中心ApplicationReadyEvent标记健康状态为UP暴露/actuator端点2. Prometheus / Micrometer 埋点监控ContextRefreshedEvent初始化指标Registry、Meter埋点ApplicationReadyEvent启动监控推送线程、上报应用启动耗时3. Spring Security 安全框架ContextRefreshedEvent加载SecurityFilterChain、权限规则、密码编码器、JWT过滤器4. Apollo 配置中心同NacosApplicationEnvironmentPreparedEvent阶段拉远程配置通过EnvironmentPostProcessor扩展Environment六、各个事件的框架使用汇总对照表启动事件主要使用框架 核心作用ApplicationStartingEventSpringBoot Logging、编码校验仅极早期底层初始化ApplicationEnvironmentPreparedEventNacos/Config/Apollo、Bootstrap上下文、配置文件加载、日志配置、Druid分片配置ApplicationContextInitializedEvent三方自定义上下文初始化、BeanDefinition预注册ApplicationPreparedEventMyBatis Mapper扫描、配置属性绑定、Bean定义装载ContextRefreshedEvent数据库连接池、Redis、Security、Feign代理、Flyway迁移、所有单例Bean实例化ApplicationStartedEvent轻量状态打点、内部生命周期回调ApplicationReadyEventNacos/Eureka服务注册、MQ消费者启动、定时任务启动、缓存预热、监控上报、启动成功通知ApplicationFailedEvent全框架资源释放、异常日志打印、失败告警、注册中心下线实例七、框架通用扩展原理为什么都用这套事件SPI机制大部分底层监听器在spring.factories配置SpringBoot启动自动实例化不需要Component时序强依赖配置类必须早于容器创建 → 绑定EnvironmentPreparedEventBean实例化必须在ContextRefreshedEvent对外注册、消费必须等服务完全可用 → ApplicationReadyEvent容错隔离启动失败事件统一回收资源避免连接泄漏、脏注册实例扩展一致性所有三方框架统一接入Spring事件标准不用各自实现一套启动生命周期。八、业务开发参考模仿框架设计规范配置解密、动态配置 → 监听ApplicationEnvironmentPreparedEvent数据库初始化脚本、自定义Bean装配 →ContextRefreshedEvent服务注册、消息消费、缓存预热、钉钉启动通知 →ApplicationReadyEvent失败告警、资源关闭 →ApplicationFailedEvent极早期启动参数校验 →ApplicationStartingEvent必须用addListeners注册EventListener抓不到代码示例监听所有事件可直接复制方式 1使用 EventListener 注解最简单importorg.springframework.boot.context.event.*;importorg.springframework.context.event.ContextRefreshedEvent;importorg.springframework.context.event.EventListener;importorg.springframework.stereotype.Component;ComponentpublicclassBootAllEventListener{EventListener(ApplicationStartingEvent.class)publicvoidonStart(){System.out.println(1. 应用开始启动);}EventListener(ApplicationEnvironmentPreparedEvent.class)publicvoidonEnvPrepared(){System.out.println(2. 环境配置已加载);}EventListener(ApplicationContextInitializedEvent.class)publicvoidonContextInit(){System.out.println(3. 容器初始化完成);}EventListener(ApplicationPreparedEvent.class)publicvoidonContextPrepared(){System.out.println(4. 容器准备完成Bean未加载);}EventListener(ContextRefreshedEvent.class)publicvoidonContextRefreshed(){System.out.println(5. 容器刷新完成Bean已加载);}EventListener(ApplicationStartedEvent.class)publicvoidonStarted(){System.out.println(6. 应用已启动);}EventListener(ApplicationReadyEvent.class)publicvoidonReady(){System.out.println(7. 应用就绪可以接收请求);// 这里写启动后必执行逻辑服务注册、缓存预热等}EventListener(ApplicationFailedEvent.class)publicvoidonFailed(){System.err.println(8. 应用启动失败);}}方式 2实现 ApplicationListener 接口早期事件必须用这个ApplicationStartingEvent 等早期事件EventListener 抓不到必须用如下方式importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.boot.context.event.ApplicationStartingEvent;importorg.springframework.context.ApplicationListener;SpringBootApplicationpublicclassDemoApplication{publicstaticvoidmain(String[]args){SpringApplicationappnewSpringApplication(DemoApplication.class);// 注册早期事件监听器app.addListeners((ApplicationListenerApplicationStartingEvent)event-{System.out.println(早期事件应用启动中);});app.run(args);}}