Srpingboot扩展点
# 🚀 深入理解 Spring Boot 扩展点:从启动阶段到 Bean 生命周期全面解析
在日常开发中,很多人只熟悉 Spring 的 Bean 生命周期的 9 大扩展点,但一旦涉及到 Starter 设计、配置动态加载、Nacos 共享配置自动化,就容易踩坑。
根本原因是没理解 Spring Boot 启动阶段扩展点 和 Spring Bean 生命周期扩展点 是两个完全不同的阶段:
- Spring Boot 启动阶段 → 操作配置、Environment、ApplicationContext
- Spring Bean 生命周期阶段 → 操作 Bean 定义、Bean 实例化、初始化、销毁
本文给你一份 全面脉络图 + 实战示例 + 推荐最佳实践,搞懂了以后写 starter、定制框架、做大厂级工程都能玩得很溜 🚀。
# 🌳 Spring Boot 启动阶段扩展点
(图参考 Spring 官方启动流程,自己可以手绘一份记忆更深刻)
阶段 | 扩展点 | 作用 | 场景 |
---|---|---|---|
very early (main 方法中) | SpringApplicationRunListener | 监听整个 SpringApplication 启动流程 | 做定制 logging、埋点 |
Environment 准备阶段 | EnvironmentPostProcessor ⭐ | 动态修改 Environment / 添加 PropertySource | 自动添加共享配置、动态 profile |
ApplicationContext 初始化之前 | ApplicationContextInitializer | 初始化 ConfigurableApplicationContext,如注册自定义 BeanFactoryPostProcessor | 改造 ApplicationContext |
ApplicationContext refresh 之后 | ApplicationListener<ApplicationPreparedEvent> | Context 初始化完毕,Bean 尚未 fully init | 打印环境信息、做监控注入 |
ApplicationContext started | ApplicationListener<ApplicationStartedEvent> | Context fully started,Bean fully 初始化完毕 | 做通知、健康检查 |
Application ready | ApplicationListener<ApplicationReadyEvent> | App ready,外部流量可以进来 | 启动定时任务、发启动通知 |
# 最核心的扩展点:
- EnvironmentPostProcessor
👉 推荐 starter 里动态修改配置使用
👉 比如你要自动加
spring.cloud.nacos.config.shared-configs
,最佳用这个 - ApplicationContextInitializer 👉 如果你要注册额外的 BeanFactoryPostProcessor、BeanDefinition,这个阶段合适
# 🌼 Spring Bean 生命周期 9 大扩展点
注意:Bean 生命周期阶段操作的是 Bean,不是配置!
阶段 | 扩展点 | 作用 |
---|---|---|
1️⃣ BeanDefinitionRegistryPostProcessor | 改 BeanDefinition,可以动态注册 BeanDefinition | |
2️⃣ BeanFactoryPostProcessor | 改 BeanFactory,能改 PropertyValue | |
3️⃣ InstantiationAwareBeanPostProcessor | 改 Bean 实例化过程 | |
4️⃣ BeanPostProcessor.beforeInitialization | Bean 初始化之前处理 Bean | |
5️⃣ Aware 接口 | BeanNameAware, EnvironmentAware 等 | |
6️⃣ InitializingBean / afterPropertiesSet | 初始化阶段 | |
7️⃣ @PostConstruct | 初始化阶段 | |
8️⃣ BeanPostProcessor.afterInitialization | Bean 初始化之后处理 Bean | |
9️⃣ DisposableBean / destroy / @PreDestroy | 销毁阶段 |
# 常见用法:
扩展点 | 用法示例 |
---|---|
BeanDefinitionRegistryPostProcessor | 动态注册 Mapper、配置类 |
BeanFactoryPostProcessor | 改 Spring Boot 自动配置里的一些 property |
InstantiationAwareBeanPostProcessor | 动态代理 Bean(AOP) |
BeanPostProcessor | 注入监控埋点 |
InitializingBean / @PostConstruct | 初始化逻辑 |
DisposableBean / @PreDestroy | 关闭资源、线程池 |
# 🚀 实战案例
# 场景:我希望我的 sentinel-starter
能自动加载一个 oCloud-sentinel-gateway.yaml
,用户不需要自己写 shared-configs
最佳方案:
public class SentinelGatewayEnvironmentPostProcessor implements EnvironmentPostProcessor, Ordered {
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
Map<String, Object> map = new HashMap<>();
map.put("spring.cloud.nacos.config.shared-configs[100].data-id", "oCloud-sentinel-gateway.yaml");
map.put("spring.cloud.nacos.config.shared-configs[100].group", environment.getProperty("spring.cloud.nacos.config.group"));
map.put("spring.cloud.nacos.config.shared-configs[100].refresh", "true");
environment.getPropertySources().addFirst(new MapPropertySource("sentinel-shared-configs", map));
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
META-INF/spring.factories:
org.springframework.boot.env.EnvironmentPostProcessor=\
com.olight.cloud.sentinel.gateway.env.SentinelGatewayEnvironmentPostProcessor
1
2
3
2
3
这样用户只要加 starter,不用加任何 shared-configs,就能自动读取 sentinel 配置 → 和大厂做法一致(Spring Cloud Alibaba Sentinel starter、RocketMQ starter 都是这样玩的)。
# ✨ 总结口诀
- 改配置 → EnvironmentPostProcessor
- 改 ApplicationContext → ApplicationContextInitializer
- 改 Bean 定义 → BeanDefinitionRegistryPostProcessor
- 改 Bean 属性 → BeanFactoryPostProcessor
- 改 Bean 实例 → BeanPostProcessor
- 改 Bean 生命周期 → InitializingBean / DisposableBean / Aware
# 🔔 建议记忆策略
1️⃣ Spring Boot 启动阶段是在 ApplicationContext.refresh() 之前 → 你 starter 要改配置必须在这里做。
2️⃣ Bean 生命周期阶段是 ApplicationContext.refresh() 之后 → 只能改 Bean,不影响配置绑定。
3️⃣ 实战里你 starter 99% 的需要是:
- 自动加共享配置 → EnvironmentPostProcessor
- 注册一些 AOP/监控 Bean → BeanPostProcessor
- 动态注册一些 Factory → BeanDefinitionRegistryPostProcessor
# 🌟 结语
👉 希望本文能帮你从 "只知道 Bean 生命周期" → 升级为 掌握 Spring Boot 完整启动生命周期。 👉 只有掌握了 启动阶段 + Bean 生命周期 两大阶段,才能写出真正大厂级、优雅、可维护的 starter。
# 🚀 延伸阅读:
- Spring Boot 官方文档: Externalized Configuration (opens new window)
- Spring Framework 官方文档: Bean Lifecycle (opens new window)
- Spring Boot Application Startup Flow: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-Application-Lifecycle
上次更新: 2025/10/11, 09:06:13