每个新项目都在复制粘贴
公司每个新项目都要复制一遍短信工具类、改一遍配置、踩一遍一样的坑——这就是该做成 Starter 的信号:把组件连同默认配置封装成一个依赖,新项目引一下、写两行配置就能用。这篇用三十行代码走完全程。
先立规矩:命名与结构
官方 Starter 叫 spring-boot-starter-xxx;第三方(自己公司)用 xxx-spring-boot-starter,比如 sms-spring-boot-starter,一眼区分来源。工程结构不复杂,一个模块装三样东西:Properties 类(绑定配置项)、AutoConfiguration 类(装配入口)、服务本体(真正干活的类),再加一个注册文件。
三段代码走完全程
// 1. 配置属性:application.yml 里 sms 前缀的配置自动绑进来
@ConfigurationProperties(prefix = "sms")
public class SmsProperties {
/** 网关地址 */
private String url;
/** 应用密钥 */
private String secret;
// getter / setter 省略
}
// 2. 自动配置类:负责把 Bean 装进容器
@AutoConfiguration
@EnableConfigurationProperties(SmsProperties.class)
@ConditionalOnClass(SmsClient.class)
public class SmsServiceAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public SmsService smsService(SmsProperties properties) {
return new SmsService(properties.getUrl(), properties.getSecret());
}
}# 3. 注册文件:META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
# 内容就一行,每行一个自动配置类的全限定名
com.example.sms.SmsServiceAutoConfiguration发布到私服之后,使用方三步接入:引依赖、写配置、注入使用——工具类不存在了,坑也不再重复踩。
# 使用方的 application.yml
sms:
url: https://gw.example.com/sms
secret: your-key三个设计细节
一,@ConditionalOnMissingBean 是留后门的艺术:默认实现给你,但用户随时可以自己定义同类型 Bean 覆盖——Starter 只做默认值,不做独裁者,这正是上一篇讲的用户优先原则。二,配置提示:工程里引入 spring-boot-configuration-processor 依赖重新编译,IDE 里写 sms.url 会有自动补全和注释提示。三,可选依赖打 tag:真正可选的第三方客户端用 optional 依赖引入,@ConditionalOnClass 才有存在意义——没引客户端的工程,Starter 自动隐身。
下一篇盘点 Spring 里那些低调的扩展点:不动框架源码,也能在关键位置装上自己的钩子。
评论 (0)