SpringBoot:封装 starter

01 Starter 核心机制

SpringBoot 核心思想是约定大于配置,而 Starter 正是这一思想的核心落地载体。

简单来说,Starter 把某一类功能的依赖管理、默认配置、自动装配逻辑打包成一个独立 Jar 包。

项目只需引入这个 Jar 包,就能直接使用对应功能,无需关心底层依赖的具体版本、Bean 如何配置等细节。

02 Starter 开发规范

想要开发出符合 SpringBoot 生态、易维护的 Starter,需遵循以下核心规范:

02.1 命名规范
• 官方 Starter:统一采用 spring-boot-starter-* 命名格式,例如 spring-boot-starter-web。
• 第三方 Starter:推荐使用 xxx-spring-boot-starter 格式,例如 mybatis-spring-boot-starter。

02.2 版本管理规范
必须统一继承 spring-boot-dependencies BOM(物料清单),避免因依赖传递导致的版本冲突问题。

02.3 模块划分规范
合理的模块拆分能让 Starter 职责单一、支持可插拔,推荐拆分方式:

xxx-spring-boot-starter(空壳模块,仅做依赖聚合管理)
xxx-spring-boot-autoconfigure(核心模块,包含自动配置代码)
xxx-spring-boot-starter-core(可选模块,存放纯业务 API 逻辑)

02.4 自动配置类规范
SpringBoot 3.x 版本起,推荐使用 @AutoConfiguration 注解替代传统的 @Configuration 注解定义自动配置类。

02.5 条件注解规范
必须合理使用条件注解(如 @ConditionalOnClass、@ConditionalOnProperty、@ConditionalOnMissingBean),既能避免 Bean 重复装配,也能保证用户可自定义覆盖默认 Bean。

02.6 配置元数据规范
建议提供 spring-configuration-metadata.json 文件,辅助 IDE 实现配置项的自动提示,提升用户使用体验。

02.7 SPI 注册规范
自动配置类需要通过 SPI 机制让 SpringBoot 扫描到,不同版本配置方式不同:

• SpringBoot 3.x:配置文件路径 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports。
• SpringBoot 2.x:配置文件路径 META-INF/spring.factories。
建议同时兼容两个版本的配置方式,提升 Starter 兼容性。

03 Starter 开发实战:以短信(SMS)功能为例

下面以企业常用的短信发送功能为例,完整演示 Starter 的开发流程。

本次实战将 Starter 拆分为两个核心模块:

• sms-spring-boot-autoconfigure:负责自动配置逻辑和核心业务实现。
• sms-spring-boot-starter:仅做依赖聚合管理,简化用户引入操作。

03.1 autoconfigure 模块开发
该模块是 Starter 的核心,包含配置项定义、核心功能实现、自动配置逻辑等。

(1)配置项类定义
用于绑定用户在配置文件中定义的短信相关配置,通过 @ConfigurationProperties 指定配置前缀。

importlombok.Data;importorg.springframework.boot.context.properties.ConfigurationProperties;/** * 短信配置项类 * 绑定配置文件中以 "sms" 为前缀的配置项 */@Data// Lombok 注解,自动生成getter/setter/toString等方法@ConfigurationProperties(prefix="sms")// 指定配置前缀publicclassSmsProperties{// 短信功能总开关privatebooleanenabled=true;// 云厂商AccessKey(访问密钥)privateStringaccessKey;// 云厂商SecretKey(密钥)privateStringsecretKey;// 云厂商地域(如阿里云的cn-hangzhou)privateStringregion;}

(2)核心功能接口与实现
定义短信发送的标准接口,以及阿里云短信的具体实现(可扩展其他厂商)。

importjava.util.Map;/** * 短信发送模板接口 * 定义短信发送的标准方法,适配不同云厂商实现 */publicinterfaceSmsTemplate{/** * 发送短信 * @param mobile 接收短信的手机号 * @param sign 短信签名 * @param template 短信模板编码 * @param params 短信模板参数(如验证码、有效期等) * @return 发送结果(自定义SendResult类,包含发送状态、回执ID等) */SendResultsend(Stringmobile,Stringsign,Stringtemplate,Map<String,String>params);}/** * 阿里云短信模板实现类 * 实现SmsTemplate接口,对接阿里云短信SDK */publicclassAliyunSmsTemplateimplementsSmsTemplate{// 注入短信配置项privatefinalSmsPropertiessmsProperties;// 构造方法注入配置publicAliyunSmsTemplate(SmsPropertiessmsProperties){this.smsProperties=smsProperties;// 初始化阿里云短信客户端(此处省略SDK初始化逻辑)}/** * 实现短信发送方法 * @param mobile 手机号 * @param sign 短信签名 * @param template 模板编码 * @param params 模板参数 * @return 发送结果 */@OverridepublicSendResultsend(Stringmobile,Stringsign,Stringtemplate,Map<String,String>params){// 1. 构建阿里云短信请求参数// 2. 调用阿里云短信SDK发送短信// 3. 解析SDK返回结果,封装为SendResult返回// 此处省略具体SDK调用逻辑,可参考阿里云官方文档returnnewSendResult(true,"发送成功",System.currentTimeMillis()+"");}}/** * 短信发送结果封装类 * 简化示例,实际可扩展更多字段(如错误码、错误信息等) */classSendResult{// 是否发送成功privatebooleansuccess;// 提示信息privateStringmsg;// 短信回执IDprivateStringbizId;publicSendResult(booleansuccess,Stringmsg,StringbizId){this.success=success;this.msg=msg;this.bizId=bizId;}// 省略getter/setter方法}

(3)自动配置类定义
核心配置类,控制 Bean 的创建条件和逻辑,保证按需装配、可覆盖。

importorg.springframework.boot.autoconfigure.AutoConfiguration;importorg.springframework.boot.autoconfigure.condition.ConditionalOnClass;importorg.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;importorg.springframework.boot.autoconfigure.condition.ConditionalOnProperty;importorg.springframework.boot.context.properties.EnableConfigurationProperties;importorg.springframework.context.annotation.Bean;/** * 短信自动配置类 * SpringBoot 3.x 推荐使用@AutoConfiguration替代@Configuration */@AutoConfiguration// 替代3.x之前的@Configuration,标识自动配置类@ConditionalOnClass(SmsTemplate.class)// 仅当类路径下存在SmsTemplate时才生效@EnableConfigurationProperties(SmsProperties.class)// 启用配置项绑定,让SmsProperties生效@ConditionalOnProperty(prefix="sms",name="enabled",matchIfMissing=true)// 仅当sms.enabled为true时生效,默认开启publicclassSmsAutoConfiguration{/** * 注册SmsTemplate Bean * @param props 注入短信配置项(Spring自动绑定) * @return 阿里云短信模板实例 */@Bean// 向Spring容器注册Bean@ConditionalOnMissingBean// 仅当容器中不存在SmsTemplate类型的Bean时才创建,允许用户自定义覆盖publicSmsTemplatesmsTemplate(SmsPropertiesprops){returnnewAliyunSmsTemplate(props);}}

(4)SPI 注册配置
让 SpringBoot 能扫描到自动配置类,3.x 版本需创建以下文件:

文件路径:src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

文件内容(配置自动配置类的全类名):

com.example.sms.boot.SmsAutoConfiguration

(5)配置元数据(可选)
辅助 IDE 实现配置项的自动提示,提升用户体验,创建以下文件:
文件路径:src/main/resources/META-INF/additional-spring-configuration-metadata.json

文件内容:

{"properties":[{"name":"sms.enabled","type":"java.lang.Boolean","defaultValue":true,"description":"短信服务总开关,默认开启。"},{"name":"sms.access-key","type":"java.lang.String","description":"云厂商短信服务的AccessKey,必填。"},{"name":"sms.secret-key","type":"java.lang.String","description":"云厂商短信服务的SecretKey,必填。"},{"name":"sms.region","type":"java.lang.String","description":"云厂商短信服务的地域编码(如阿里云cn-hangzhou)。"}]}

可借助 spring-boot-configuration-processor 依赖或 spring-boot-properties-maven-plugin 插件自动生成该文件,减少手动编写成本。

03.2 starter 模块开发
该模块为“空壳”模块,仅聚合依赖,简化用户引入操作。

Maven 依赖配置示例:

<dependencies><!--聚合autoconfigure模块,核心逻辑依赖--><dependency><groupId>com.example.sms</groupId><artifactId>sms-spring-boot-autoconfigure</artifactId><version>${project.version}</version></dependency><!--阿里云短信SDK,无需用户单独引入--><dependency><groupId>com.aliyun</groupId><artifactId>dysmsapi20170525</artifactId><version>2.0.24</version></dependency></dependencies>

03.3 Starter 使用示例
用户只需两步即可使用开发好的短信 Starter。

(1)引入 Starter 依赖
在项目的 pom.xml 中引入:

<dependency><groupId>com.example.sms</groupId><artifactId>sms-spring-boot-starter</artifactId><version>1.0.0</version></dependency>

(2)配置短信参数
在 application.yml/application.properties 中配置:

sms:access-key:your-aliyun-access-key # 替换为实际AccessKeysecret-key:your-aliyun-secret-key # 替换为实际SecretKeyregion:cn-hangzhou # 替换为实际地域 # enabled:true# 默认开启,可省略

(3)注入使用
在业务代码中注入 SmsTemplate 即可使用:

importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importjavax.annotation.Resource;importjava.util.HashMap;importjava.util.Map;/** * 注册控制器示例 * 演示短信验证码发送功能 */@RestControllerpublicclassRegisterController{// 注入Spring容器中的SmsTemplate Bean(自动配置类创建)@ResourceprivateSmsTemplatesmsTemplate;/** * 发送注册验证码 * @param mobile 手机号 * @return 操作结果 */@PostMapping("/send/register/code")publicStringsendRegisterCode(@RequestParamStringmobile){// 1. 生成6位随机验证码Stringcode=String.valueOf((int)((Math.random()*9+1)*100000));// 2. 构建短信模板参数Map<String,String>params=newHashMap<>();params.put("code",code);params.put("expireTime","5");// 有效期5分钟// 3. 调用短信模板发送短信SendResultresult=smsTemplate.send(mobile,"XX平台","SMS_123456789",params);// 4. 处理发送结果if(result.isSuccess()){return"验证码发送成功,请注意查收";}else{return"验证码发送失败:"+result.getMsg();}}}

04 进阶:@Enable 注解的使用

除了通过 SPI 实现自动装配,还可以通过 @EnableXXX 注解手动控制 Starter 功能的开启/关闭,适用于高级能力的显式开关。

以短信 Starter 为例,实现 @EnableSms 注解,支持手动开启/关闭指标监控(metrics)能力。

04.1 定义 @EnableSms 注解

importorg.springframework.context.annotation.Import;importjava.lang.annotation.*;/** * 开启短信功能注解 * 可手动控制是否开启短信功能及扩展能力(如metrics) */@Target(ElementType.TYPE)// 注解作用于类/接口@Retention(RetentionPolicy.RUNTIME)// 运行时生效@Documented// 生成文档时包含该注解@Import(SmsConfigurationSelector.class)// 导入配置选择器,动态加载配置类public@interfaceEnableSms{/** * 是否开启短信发送指标监控(如发送成功率、耗时等) * @return 默认开启 */booleanmetrics()defaulttrue;}

04.2 实现配置选择器
通过 ImportSelector 动态选择需要加载的配置类:

importorg.springframework.context.annotation.ImportSelector;importorg.springframework.core.annotation.MultiValueMap;importorg.springframework.core.type.AnnotationMetadata;importjava.util.ArrayList;importjava.util.List;/** * 短信配置选择器 * 根据@EnableSms注解的属性,动态加载对应的配置类 */publicclassSmsConfigurationSelectorimplementsImportSelector{/** * 选择需要导入的配置类全类名 * @param annotationMetadata 注解元数据(包含@EnableSms的属性) * @return 配置类全类名数组 */@OverridepublicString[]selectImports(AnnotationMetadataannotationMetadata){// 1. 获取@EnableSms注解的所有属性MultiValueMap<String,Object>attrs=annotationMetadata.getAllAnnotationAttributes(EnableSms.class.getName());// 2. 获取metrics属性值(默认true)booleanmetrics=attrs!=null&&(boolean)attrs.getFirst("metrics");// 3. 构建需要导入的配置类列表List<String>configClasses=newArrayList<>();// 核心短信自动配置类必加载configClasses.add("com.example.sms.core.SmsAutoConfiguration");// 如果开启metrics,加载指标监控配置类if(metrics){configClasses.add("com.example.sms.actuate.SmsMetricsAutoConfiguration");}// 4. 转换为数组返回returnconfigClasses.toArray(newString[0]);}}

04.3 使用 @EnableSms 注解
在 SpringBoot 启动类上添加注解,显式控制功能:

importcom.example.sms.annotation.EnableSms;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;/** * 应用启动类 * 通过@EnableSms手动关闭metrics能力 */@EnableSms(metrics=false)// 开启短信功能,关闭指标监控@SpringBootApplicationpublicclassDemoApplication{publicstaticvoidmain(String[]args){SpringApplication.run(DemoApplication.class,args);}}

05 Starter 最佳实践总结

  1. 基础功能:通过 SPI 机制实现自动装配,配置项通过 yaml/properties 注入,降低用户使用成本。
  2. 高级能力:配合 @EnableXXX 注解实现显式开关,让用户可按需开启扩展功能(如监控、日志等)。
  3. 兼容性:同时兼容 SpringBoot 2.x 和 3.x 的 SPI 注册方式,提升 Starter 适用范围。
  4. 可扩展:核心接口抽象化(如 SmsTemplate),方便扩展不同厂商的实现(阿里云、腾讯云等)。
  5. 易用性:提供配置元数据,辅助 IDE 自动提示,完善注释文档,降低用户接入门槛。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1196717.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

滴滴 wsgsig secdd-challenge

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由 此产生的一切后果均与作者无关&#xff01; 部分python代码 url "ota/re…

RabbitMQ 在大数据领域的故障排查与解决方案

RabbitMQ 在大数据领域的故障排查与解决方案 关键词:RabbitMQ、大数据、消息队列、故障排查、性能优化、高可用性、消息丢失 摘要:本文深入探讨RabbitMQ在大数据环境下的常见故障及其解决方案。我们将从RabbitMQ的核心架构出发,分析其在大数据场景下面临的挑战,详细介绍故障…

Linux 内核漏洞提权

一、 内核提权的核心原理Linux 采用权限分级机制&#xff08;root:0&#xff0c;普通用户&#xff1a;1-65535&#xff09;&#xff0c;内核运行在最高权限的内核态&#xff08;Ring 0&#xff09;&#xff0c;用户程序运行在用户态&#xff08;Ring 3&#xff09;。内核提权的…

连接 AI 的隐形纽带:深度解构 MCP 传输层——从 Stdio 到 SSE 的实战抉择与架构差异

文章目录 &#x1f6f0;️ 连接 AI 的隐形纽带&#xff1a;深度解构 MCP 传输层——从 Stdio 到 SSE 的实战抉择与架构差异 &#x1f4e1;&#x1f3d7;️ 第一章&#xff1a;协议与通道的解耦——MCP 通信的底层逻辑1.1 JSON-RPC 2.0&#xff1a;MCP 的通用语言1.2 传输层的两…

计算机毕业设计springboot基于农科所农作物信息管理系统的设计与实现 基于SpringBoot的农业科研院所作物数据智慧管理平台的设计与实现面向农科机构的SpringBoot作物全生命周期

计算机毕业设计springboot基于农科所农作物信息管理系统的设计与实现8h3n8w22 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。在“互联网农业”快速渗透的今天&#xff0c;农科所…

测试转网络安全如何弯道超车?

目录&#x1f62d; 测试的痛&#xff0c;谁懂&#xff1f;1. 重复劳动&#xff0c;永无止境2. 被动等待&#xff0c;毫无主动权3. 技术含量低&#xff0c;成长受限❓ 转行网安1. 测试经验&#xff0c;天然就是安全优势2. 技能高度重叠&#xff0c;转型零成本3. 工作模式更自由&…

Java计算机毕设之基于springboot的智慧医疗网上预约系统智慧医疗服务-智慧医疗服务平台(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

微服务架构演进实战 从单体到微服务的拆分原则与DDD入门

目录 &#x1f4a1; 先说说我经历的微服务"车祸现场" ✨ 摘要 1. 为什么需要从单体转向微服务&#xff1f; 1.1 单体的痛苦现实 1.2 微服务的核心优势 2. 领域驱动设计&#xff08;DDD&#xff09;核心概念 2.1 战略设计&#xff1a;划分业务边界 2.2 战术设…

python mqgg 发送 json 文件

pip install paho-mqtt 发送json&#xff0c;含有音频文件&#xff1b; import json, base64 import paho.mqtt.client as mqtt import timedef on_connect(client, userdata, flags, rc):if rc 0:print("[A] Connected to broker")client.subscribe(TOPIC_SUB)pri…

学习日记day64

Day64_0121专注时间&#xff1a;目标是&#xff1a;5h30~6h。实际&#xff1a;5h47min每日任务&#xff1a;饭后的休息&#xff08;25min&#xff09;&#xff0c;学习间歇的休息&#xff08;15min&#xff09;都用手表计时器来监督{step1}40min二刷1道力扣hot100昨天的题再做一…

GGUF、Safetensors、ONNX三种格式

https://blog.csdn.net/woshihlf/article/details/149123005 GGUF、Safetensors、ONNX三种格式

Java毕设项目:基于springboot的智慧医疗网上预约系统(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

springboot_ssm815大学生校园图书借阅购买管理系统--论文

目录具体实现截图摘要系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 摘要 随着高校图书馆信息化建设的不断推进&#xff0c;传统的人工管理模式已难以满足师生对图书借阅与购买的高效需求。基于…

#对象模型

Qt 对象模型的核心是元对象系统&#xff08;Meta-Object System&#xff09;Qt的对象模型是Qt核心特性的基础&#xff0c;它定义了对象的组织和交互方式 Qt的对象模型基于C的面向对象编程的原则&#xff0c;而我们又可以大致理解为对象模型是由QObject类以及它的特性元对象系统…

强烈安利8个AI论文平台,本科生搞定毕业论文!

强烈安利8个AI论文平台&#xff0c;本科生搞定毕业论文&#xff01; AI 工具让论文写作不再难 对于许多本科生来说&#xff0c;毕业论文的撰写是一个既重要又令人头疼的任务。从选题、收集资料到撰写初稿、反复修改&#xff0c;每一步都可能让人感到力不从心。而随着 AI 技术的…

springboot_ssm816大学运动场地预约器材租借管理系统--论文

目录具体实现截图摘要系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 摘要 随着高校体育运动的普及和场地资源的有限性&#xff0c;传统的人工管理方式已无法满足师生对运动场地和器材的高效预约…

leetcode 热题

leetcode 热题目录1、无重复字符的最长子串(3)2、LRU缓存机制(146)3、反转链表(206)4、数组中的第K个最大元素(215) 1、无重复字符的最长子串(3) 2、LRU缓存机制(146) 3、反转链表(206) 两个指针,prev和…

[ACTF2020 新生赛]Upload 1(一句话木马加蚁剑)

上传图片一句话木马&#xff0c;他的后缀名一定是白名单里的 如果图片一句话木马太大&#xff0c;记得先改一下图片像素&#xff0c;让文件减小&#xff0c;再生成图片一句话木马上传时打开BP拦截&#xff0c;将.jpg改为.phtml 再点击放行 phtml文件相当于php文件的早期形式&am…

springboot_ssm817学生信息管理系统--论文

目录 具体实现截图摘要 系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 具体实现截图 摘要 随着信息技术的快速发展&#xff0c;高校学生信息管理系统的智能化、高效化需求日益增长。传统的纸质或单机版管理…

【深度测评】2026年护考刷题APP算法横评:为何“易小考”能成为护资备考首选?

前言:医学教育软件的“去应试化”技术变革 随着2026年护士执业资格考试(护资)与初级护师考试的改革深化,命题逻辑已从单纯的知识点记忆转向临床思维与病例分析。据《2025-2026年中国医学教育软件行业发展白皮书》数…