如何自定义一个 Spring Boot Starter?Starter 机制是怎么工作的?
结论先行:Starter = “依赖描述 + 自动配置”的组合包。官方 Starter 只做两件事:用 pom 把所需依赖聚合进来,再用自动配置类按条件装配默认 Bean。自定义 Starter 的最小闭环是:写自动配置类 → 建 AutoConfiguration.imports 清单 → 提供 @ConfigurationProperties 属性类 → 引用方依赖即生效。
一、Starter 的组成
| 部分 | 说明 | 示例 |
|---|---|---|
| 依赖管理 | 在 pom 里声明引用方需要的库 | spring-data-redis、连接池 |
| 自动配置 | 条件注解装配默认 Bean | RedisConnectionFactory |
| 属性绑定 | 前缀化的可配置项 | spring.data.redis.* |
| 清单注册 | imports 文件登记自动配置类 | AutoConfiguration.imports |
官方命名:spring-boot-starter-*(被 Boot 收录);自研约定 xxx-spring-boot-starter,业务前缀不要用 spring-boot-。
二、三步实现一个 Starter
- 自动配置类:用 @AutoConfiguration + @ConditionalOnClass 判定依赖是否存在:
@AutoConfiguration
@ConditionalOnClass(SomeClient.class)
@EnableConfigurationProperties(SomeProperties.class)
public class SomeAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public SomeClient someClient(SomeProperties props) {
return new SomeClient(props.getUrl());
}
}
- 属性类:
@ConfigurationProperties(prefix = "app.some")+ JavaBean 规范(getter/setter),启动类上用 @EnableConfigurationProperties 或 @ConfigurationPropertiesScan 扫描; - 注册清单:在
src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports写入一行全类名。
三、进阶要点
- 自动配置类一般放在独立模块(如 xxx-autoconfigure),starter 模块只依赖它,便于被官方 Boot 生态复用;
- 需要条件生效时多用 @ConditionalOnMissingBean,保证用户可整体替换;
- 属性提示可加
additional-spring-configuration-metadata.json(IDE 补全/校验用,非必需); - 测试时写一个最小应用或 @SpringBootTest 验证自动配置是否按条件装配。
常见追问 / 记忆点
- 追问:starter 与普通依赖的区别?答:普通依赖只引入 jar;starter 额外携带“自动装配入口”,让功能开箱即用。
- 追问:自己写的自动配置类为什么不生效?答:先查 imports 文件路径/内容、条件注解是否满足、是否被 exclude、是否用户已定义同名 Bean。
- 记忆点:Starter = 聚合依赖 + 自动配置;让位用户靠 @ConditionalOnMissingBean。