SpringBoot封装starter完整代码示例

 更新时间:2026年03月24日 09:52:35   作者:cadecode  
SpringBoot之所以大大地简化了我们的开发,用到的一个很重要的技术就是Starter机制,这篇文章主要介绍了SpringBoot封装starter的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

starter 机制

SpringBoot 采用约定大于配置思想,starter 是此思想的落地载体

starter 是将功能依赖 + 默认配置 + 自动装配打包成一个 jar,项目只要引入此 jar 即可获得完整能力,无需关心底层到底需要哪些库、怎么配 Bean

starter 规范

  1. 命名

    官方:spring-boot-starter-*​,如 spring-boot-starter-web

    第三方:xxx-spring-boot-starter​,如 mybatis-spring-boot-starter

  2. 版本管理

    统一继承 spring-boot-dependencies BOM,避免传递版本冲突

  3. 模块划分

    xxx-spring-boot-starter(空壳,只管理依赖)
    xxx-spring-boot-autoconfigure(自动配置代码)
    xxx-spring-boot-starter-core(可选,纯业务 API)
    

    通过合理拆分模块,实现职责单一、可插拔

  4. 自动配置类

    使用注解 @Configuration,@AutoConfiguration 从 3.x 起替代 @Configuration

  5. 条件注解

    使用 @ConditionalOnClass、@ConditionalOnProperty、@ConditionalOnMissingBean 等,防止重复装配、保证可覆盖

  6. 配置元数据

    提供 spring-configuration-metadata.json,辅助 IDE 对配置自动提示

  7. SPI 注册

    配置文件:

    • META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(3.x 版本)

    • spring.factories(2.x 版本)

    可同时提供两个版本来提高兼容性

开发实践

以企业中短信功能为场景,封装 SMS starter

SMS starter 分为两个模块

  • sms-spring-boot-autoconfigure:自动配置、核心功能
  • sms-spring-boot-stater:依赖管理

autoconfigure 模块

配置项类

@Data
@ConfigurationProperties(prefix = "sms")
public class SmsProperties {
	// 开关
    private boolean enabled;
    private String accessKey;
    private String secretKey;
    private String region;
}

核心功能接口与实现

// SMS 功能模板类
public interface SmsTemplate {
    SendResult send(String mobile, String sign, String template, Map<String,String> params);
}

// 阿里云 SMS 功能实现
public class AliyunSmsTemplate implements SmsTemplate {
	// implement...
}

自动配置类

@AutoConfiguration // 3.x 版本代替 @Configuration 
@ConditionalOnClass(SmsTemplate.class)
@EnableConfigurationProperties(SmsProperties.class)
@ConditionalOnProperty(prefix = "sms", name = "enabled", matchIfMissing = true)
public class SmsAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public SmsTemplate smsTemplate(SmsProperties props) {
        return new AliyunSmsTemplate(props);
    }
}

注册 SPI

创建文件 src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

配置自动配置类全类名

com.example.sms.boot.SmsAutoConfiguration

配置元数据(可选)

创建文件 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."
    }
  ]
}

可以配合 spring-boot-configuration-processor​ 或者 spring-boot-properties-maven-plugin 来自动生成此文件

starter 模块

<dependencies>
    <!-- 把 autoconfigure 与必要 SDK 全部聚合 -->
    <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>

starter 的使用

引入 starter

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

yaml 配置

sms:
  access-key: xxxxx
  secret-key: xxxxx
  region: cn-hangzhou

注入使用

@RestController
class RegisterController {
	// 注入 smsTemplate
    @Resource
    private SmsTemplate smsTemplate;

    @PostMapping("/code")
    public String sendCode(@RequestParam String mobile) {
		// 使用 smsTemplate
        // smsTemplate.send(...);
        return "ok";
    }
}

@Enable 注解

在 starter 开发中一个很重要的步骤是注册 SPI,这是 SpringBoot 能自动扫描到 Configuration 从而进行自动配置的原因

除了 SPI 注册的方式,往往还能看到许多应用提供了 @EnableXXX 注解,用于手动指定是否开启功能特性

以 SMS starter 为例,编写一个 @EnableSMS 注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(SmsConfigurationSelector.class)
public @interface EnableSms {
    /**
     * 是否开启 metrics
     */
    boolean metrics() default true;
}

原理是利用 @Import 把指定配置类直接送进容器,常见三种模式:

@Import(XXX.class)       → 普通配置类
@Import(Selector.class)  → ImportSelector 可动态返回字符串数组
@Import(Registrar.class) → ImportBeanDefinitionRegistrar 可手动注册 BeanDefinition

实现 SmsConfigurationSelector

public class SmsConfigurationSelector implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata meta) {
        // 拿到注解属性
        MultiValueMap<String, Object> attrs =
                meta.getAllAnnotationAttributes(EnableSms.class.getName());
        boolean metrics = (boolean) attrs.getFirst("metrics");

        List<String> list = new ArrayList<>();
        list.add("com.example.sms.core.SmsAutoConfiguration");
		// 判断是否需要开启 metrics
        if (metrics) {
            list.add("com.example.sms.actuate.SmsMetricsAutoConfiguration");
        }
        return list.toArray(new String[0]);
    }
}

使用方式

@EnableSms(metrics = false)
@SpringBootApplication
public class DemoApplication { 
	// ...
}

starter 最佳实践:

默认功能使用 SPI 实现自动装配,使用 yaml 实现配置项注入;高级能力配合 @EnableXXX 注解,方便显式开关

 总结

到此这篇关于SpringBoot封装starter的文章就介绍到这了,更多相关SpringBoot封装starter内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JAVA不使用线程池来处理的异步的方法详解

    JAVA不使用线程池来处理的异步的方法详解

    这篇文章主要介绍了JAVA不使用线程池来处理的异步的方法,在这个示例中,asyncTask方法创建了一个新的线程来执行异步任务,这个新线程会立即开始执行,而主线程则会继续执行后续的代码,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • 面试必问项之Set实现类:TreeSet

    面试必问项之Set实现类:TreeSet

    这篇文章主要介绍了Java TreeSet类的简单理解和使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-07-07
  • Spring Boot中日志管理与异常处理实践指南

    Spring Boot中日志管理与异常处理实践指南

    本文系统化讲解SpringBoot日志管理与异常处理,涵盖Logback配置、分层异常处理、上下文记录及ELK集成,强调日志分级、自定义异常设计,增强应用稳定性与可维护性,感兴趣的朋友跟随小编一起看看吧
    2025-06-06
  • java常用工具类 Reflect反射工具类、String字符串工具类

    java常用工具类 Reflect反射工具类、String字符串工具类

    这篇文章主要为大家详细介绍了java常用工具类,包括Reflect反射工具类、String字符串工具类,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • Spring中的@Transactional的工作原理

    Spring中的@Transactional的工作原理

    这篇文章主要介绍了Spring中的@Transactional的工作原理,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-06-06
  • Spring boot自定义http反馈状态码详解

    Spring boot自定义http反馈状态码详解

    这篇文章主要给大家介绍了Spring boot自定义http反馈状态码的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。
    2017-06-06
  • java+testng+selenium的自动化测试实例

    java+testng+selenium的自动化测试实例

    这篇文章主要介绍了java+testng+selenium的自动化测试实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • IDEA2020.1创建springboot项目(国内脚手架)安装lombok

    IDEA2020.1创建springboot项目(国内脚手架)安装lombok

    这篇文章主要介绍了IDEA2020.1创建springboot项目(国内脚手架)安装lombok,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • idea文件被锁无法更改问题

    idea文件被锁无法更改问题

    这篇文章主要介绍了idea文件被锁无法更改问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java接口和抽象类的区别深入剖析

    Java接口和抽象类的区别深入剖析

    这篇文章主要介绍了Java接口和抽象类的区别,对于Java的初学者来说是需要准确掌握的概念!
    2014-07-07

最新评论