Kevin's blog Kevin's blog
首页
  • AI基础
  • RAG技术
  • 提示词工程
  • Wireshark抓包
  • 常见问题
  • 数据库
  • 代码技巧
  • 浏览器
  • 手册教程
  • 技术应用
  • 流程规范
  • github技巧
  • git笔记
  • vpn笔记
  • 知识概念
  • 学习笔记
  • 环境搭建
  • linux&运维
  • 微服务
  • 经验技巧
  • 实用手册
  • arthas常用
  • spring应用
  • javaAgent技术
  • 网站
友情链接
  • 分类
  • 标签
  • 归档

Kevin

你可以迷茫,但不可以虚度
首页
  • AI基础
  • RAG技术
  • 提示词工程
  • Wireshark抓包
  • 常见问题
  • 数据库
  • 代码技巧
  • 浏览器
  • 手册教程
  • 技术应用
  • 流程规范
  • github技巧
  • git笔记
  • vpn笔记
  • 知识概念
  • 学习笔记
  • 环境搭建
  • linux&运维
  • 微服务
  • 经验技巧
  • 实用手册
  • arthas常用
  • spring应用
  • javaAgent技术
  • 网站
友情链接
  • 分类
  • 标签
  • 归档
  • JVM性能调优

  • 并发编程

  • MySql

  • spring

    • Spring IOC加载源码
    • Bean扫描&createBean流程
    • Spring之底层架构核心概念解析
    • Spring之Bean生命周期源码解析
    • 06-Spring之依赖注入源码解析(上)
    • Spring之AOP底层源码解析
    • Spring之事务底层源码解析
    • SpringBoot自动配置原理
    • Spring推断构造方法
    • Srpingboot扩展点
      • 🌳 Spring Boot 启动阶段扩展点
        • 最核心的扩展点:
      • 🌼 Spring Bean 生命周期 9 大扩展点
        • 常见用法:
      • 🚀 实战案例
        • 场景:我希望我的 sentinel-starter 能自动加载一个 oCloud-sentinel-gateway.yaml,用户不需要自己写 shared-configs
      • ✨ 总结口诀
      • 🔔 建议记忆策略
      • 🌟 结语
        • 🚀 延伸阅读:
  • redis

  • zookeeper

  • rabbitMQ

  • 架构

  • 锁

  • 分库分表

  • 学习笔记
  • spring
kevin
2025-10-19
目录

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

META-INF/spring.factories:


org.springframework.boot.env.EnvironmentPostProcessor=\
com.olight.cloud.sentinel.gateway.env.SentinelGatewayEnvironmentPostProcessor
1
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
Spring推断构造方法
redis核心数据结构与高性能原理

← Spring推断构造方法 redis核心数据结构与高性能原理→

最近更新
01
提示词工程实践指南
10-19
02
chatGpt提示原则
10-19
03
AI是如何学习的
10-19
更多文章>
| Copyright © 2022-2025 Kevin | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式