自定义可插拔spring boot starter需遵循自动配置机制,采用starter/autoconfigure/core三模块结构,通过@autoconfiguration、条件注解和@configurationproperties实现“引入即用、按需生效”。

要自定义一个可插拔的 Spring Boot Starter 脚手架组件,核心是遵循 Spring Boot 的自动配置机制,封装通用逻辑,做到“引入即用、按需生效”。关键不在于写多少代码,而在于结构清晰、职责明确、不侵入业务。
理解 Starter 的本质
Starter 本质是一个 Maven 模块,它打包了依赖 + 自动配置类 + 配置元数据(spring.factories 或 @AutoConfiguration),让使用者只需添加依赖就能触发自动装配。它不是框架,而是“开箱即用的集成胶水”。
创建模块结构
建议采用标准三模块结构(也可单模块起步):
将 Spring Boot 2.7 项目升级到 Spring Boot 3.5 的实战流程,覆盖版本基线、依赖坐标替换、Jakarta 迁移、配置兼容、异步上下文传递改造与验证门禁。用于企业多模块 Maven 项目升级与排障。
-
starter 模块:仅声明依赖(如
xxx-spring-boot-starter),不写任何实现,只含pom.xml和空META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports -
autoconfigure 模块:核心所在,含自动配置类、条件注解(
@ConditionalOnClass、@ConditionalOnMissingBean等)、属性绑定类(@ConfigurationProperties) - core 模块(可选):放通用工具类、接口、默认实现,供 autoconfigure 引用,也方便被其他非 Spring 项目复用
编写自动配置逻辑
以一个简化日志增强 Starter 为例:
- 定义配置属性类:
LogEnhanceProperties,用@ConfigurationProperties("log.enhance")绑定application.yml中的配置项 - 编写自动配置类:
LogEnhanceAutoConfiguration,用@AutoConfiguration替代旧版@EnableAutoConfiguration,配合@Import或直接定义@Bean - 加上合理条件控制:比如只有存在
slf4j-api且未定义用户自定义LogEnhancerBean 时才注入默认实现 - 在
resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中写入该配置类全限定名(Spring Boot 2.7+ 推荐方式)
支持可插拔与定制化
真正“可插拔”,意味着允许用户轻松替换或关闭功能:
- 所有核心 Bean 都标注
@ConditionalOnMissingBean,用户定义同类型 Bean 即自动跳过 Starter 默认注入 - 提供开关属性,如
log.enhance.enabled=true,配合@ConditionalOnProperty(name = "log.enhance.enabled", havingValue = "true") - 预留扩展点:比如定义
LogEnhancerCustomizer函数式接口,让用户通过@Bean注册定制逻辑,Starter 内部用ObjectProvider收集并应用 - 避免在 Starter 中做包扫描或反射加载业务类——那是业务模块该做的事
不复杂但容易忽略:命名规范(推荐 xxx-spring-boot-starter)、版本对齐(和 Spring Boot 主版本保持兼容)、发布到私有仓库或 Maven Central 前做好测试(尤其不同 JDK/Spring Boot 版本组合)。










