如何自定义一个 Spring Boot Starter?Starter 机制是怎么工作的?

结论先行:Starter = “依赖描述 + 自动配置”的组合包。官方 Starter 只做两件事:用 pom 把所需依赖聚合进来,再用自动配置类按条件装配默认 Bean。自定义 Starter 的最小闭环是:写自动配置类 → 建 AutoConfiguration.imports 清单 → 提供 @ConfigurationProperties 属性类 → 引用方依赖即生效。

一、Starter 的组成

部分说明示例
依赖管理在 pom 里声明引用方需要的库spring-data-redis、连接池
自动配置条件注解装配默认 BeanRedisConnectionFactory
属性绑定前缀化的可配置项spring.data.redis.*
清单注册imports 文件登记自动配置类AutoConfiguration.imports

官方命名:spring-boot-starter-*(被 Boot 收录);自研约定 xxx-spring-boot-starter,业务前缀不要用 spring-boot-。

二、三步实现一个 Starter

  1. 自动配置类:用 @AutoConfiguration + @ConditionalOnClass 判定依赖是否存在:
@AutoConfiguration
@ConditionalOnClass(SomeClient.class)
@EnableConfigurationProperties(SomeProperties.class)
public class SomeAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public SomeClient someClient(SomeProperties props) {
        return new SomeClient(props.getUrl());
    }
}
  1. 属性类:@ConfigurationProperties(prefix = "app.some") + JavaBean 规范(getter/setter),启动类上用 @EnableConfigurationProperties 或 @ConfigurationPropertiesScan 扫描;
  2. 注册清单:在 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。
笔记加载中…