自定义 starter 是按 spring boot 装配契约封装的可声明式模块,需包含配置属性类、自动配置类、autoconfiguration.imports 文件和规范依赖;命名须以 -spring-boot-starter 结尾,推荐拆分为 starter 与 autoconfigure 两模块,并提供默认值、条件控制、配置提示及失败分析能力。

直接说结论:自定义 Starter 不是“打包工具类”,而是按 Spring Boot 的装配契约,把配置、属性、条件逻辑和自动装配类打包成一个可声明式引入的模块。只要团队项目加一行依赖 + 几个配置项,就能用上统一封装的功能,不用复制代码、不用手动注册 Bean、不担心版本或初始化顺序出错。
核心四件套必须齐备
一个真正可用的自定义 Starter 必须包含以下四个部分,缺一不可:
-
配置属性类(xxxProperties):用
@ConfigurationProperties(prefix = "xxx")定义可外部配置的参数,比如 host、timeout、enabled 等;加上@Component或在配置类中@EnableConfigurationProperties注册进容器。 -
自动配置类(xxxAutoConfiguration):标准的
@Configuration类,内部用@Bean声明核心组件(如 Service、Template、Filter),并搭配@ConditionalOnXXX控制加载时机(例如@ConditionalOnClass、@ConditionalOnProperty、@ConditionalOnMissingBean)。 -
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports:Spring Boot 2.7+ 强制要求的文件(旧版用
spring.factories已废弃),每行写一个自动配置类全限定名,比如:
com.example.starter.RedisCacheAutoConfiguration -
starter 模块的 pom.xml 依赖:只依赖
spring-boot-autoconfigure和必要运行时依赖(如 jedis、slf4j),spring-boot-configuration-processor设为<optional>true</optional>,用于生成 IDE 提示元数据,不参与运行。
命名与结构要守规矩
这是团队能顺利复用的前提,否则别人加了依赖也找不到配置提示、IDE 不识别、甚至自动装配不触发:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- Starter 项目 artifactId 必须以
-spring-boot-starter结尾,例如:mylog-spring-boot-starter或pay-alipay-spring-boot-starter;不能叫mylog-starter或alipay-sdk。 - 不要把 starter 和 autoconfigure 打包在一起——推荐拆成两个模块:
xxx-spring-boot-starter(空壳,只引依赖) +xxx-spring-boot-autoconfigure(含所有配置类、属性类、业务类),这样便于做条件隔离和测试。 - 配置前缀(
@ConfigurationProperties(prefix = "..."))要简短、唯一、小写,避免和官方或其他团队 starter 冲突,比如用mq.rabbit而不是spring.rabbitmq。
让别人用得顺的关键细节
光能跑还不够,要让同事愿意用、不会配错、出问题能快速定位:
- 在
xxxProperties类里提供合理默认值,并用@DefaultValue(或字段初始化)明确标出,比如private int timeout = 3000;,而不是留空靠文档说明。 - 对关键开关配置(如
enabled = false)加@ConditionalOnProperty(name = "xxx.enabled", havingValue = "true", matchIfMissing = false),确保关闭时整个功能彻底不加载,不残留 Bean。 - 加上
spring-boot-configuration-processor后,构建时会自动生成META-INF/spring-configuration-metadata.json,IDE 就能对application.yml中的配置项给出自动补全和校验提示。 - 如果初始化失败(比如连接 Redis 失败、密钥格式错误),建议实现一个
FailureAnalyzer,把报错原因翻译成人话,而不是抛出一长串BeanCreationException堆栈。
发布与接入流程很简单
团队内复用不需要发到 Maven 中央库:
- Starter 项目执行
mvn clean install,jar 包就进本地仓库了; - 其他项目在 pom.xml 中添加对应依赖,比如:
com.example
sms-aliyun-spring-boot-starter
1.2.0 - 在
application.yml里配好参数,比如:
sms.aliyun:
access-key: xxx
secret-key: xxx
region-id: cn-hangzhou - 启动后,注入
SmsService直接调用即可,无需任何额外配置或扫描。










