Spring Boot Starter 的设计原理

Spring Boot Starter 的核心设计目标是简化依赖管理和自动配置,通过约定优于配置的原则,减少开发者的手动配置工作。其设计原理主要包含以下三点:


1. 依赖聚合

  • 原理:每个 Starter 是一个 Maven/Gradle 依赖项,它聚合了一组相关的库(如 Spring MVC、Jackson、Tomcat 等)。
  • 示例spring-boot-starter-web 包含 Spring MVC、Tomcat、Jackson 等依赖,用户只需引入一个 Starter 即可获得全套功能。
  • 优势:避免手动管理多个依赖的版本兼容性问题。

2. 自动配置(Auto-Configuration)

  • 原理:通过 @Conditional 注解(如 @ConditionalOnClass@ConditionalOnMissingBean)实现条件化配置。
  • 流程
    1. Spring Boot 启动时扫描 META-INF/spring.factories 文件中定义的自动配置类。
    2. 根据当前项目的类路径、已存在的 Bean 等条件,动态决定是否启用配置。
  • 示例:当类路径存在 DataSource.class 时,自动配置嵌入式数据库(如 H2)。

3. 配置属性绑定

  • 原理:通过 @ConfigurationPropertiesapplication.properties/yml 中的属性绑定到 Java 对象。
  • 示例server.port=8080 自动绑定到内置的 ServerProperties 类。

如何自定义一个 Starter?

以下是创建自定义 Starter 的完整步骤(以 短信服务 Starter 为例):

步骤 1:创建两个模块

  • 命名规范

    • 自动配置模块:{your-service}-spring-boot-autoconfigure
    • Starter 模块:{your-service}-spring-boot-starter
  • 依赖关系:Starter 模块依赖 Autoconfigure 模块。

步骤 2:实现自动配置模块

  1. 添加 Maven 依赖

    <dependencies>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
    </dependency>
    </dependencies>
  2. 定义配置属性类

    @ConfigurationProperties(prefix = "sms")
    public class SmsProperties {
    private String apiKey;
    private String endpoint = "https://api.sms.com";
    // Getters and Setters
    }
  3. 实现业务服务

    public class SmsService {
    private final SmsProperties properties;
    public SmsService(SmsProperties properties) {
    this.properties = properties;
    }
    public void send(String message) {
    System.out.println("Sending SMS via: " + properties.getEndpoint());
    // 实际调用短信 API
    }
    }
  4. 创建自动配置类

    @Configuration
    @EnableConfigurationProperties(SmsProperties.class)
    @ConditionalOnClass(SmsService.class) // 当 SmsService 在类路径时生效
    public class SmsAutoConfiguration { @Bean
    @ConditionalOnMissingBean // 容器中无 SmsService 时创建
    public SmsService smsService(SmsProperties properties) {
    return new SmsService(properties);
    }
    }
  5. 注册自动配置类

    resources/META-INF/spring.factories 中添加:

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.example.sms.autoconfigure.SmsAutoConfiguration

步骤 3:创建 Starter 模块

  1. 仅需一个 POM 文件
    <project>
    <dependencies>
    <dependency>
    <groupId>com.example</groupId>
    <artifactId>sms-spring-boot-autoconfigure</artifactId>
    <version>1.0.0</version>
    </dependency>
    </dependencies>
    </project>

步骤 4:测试自定义 Starter

  1. 在项目中引入 Starter

    <dependency>
    <groupId>com.example</groupId>
    <artifactId>sms-spring-boot-starter</artifactId>
    <version>1.0.0</version>
    </dependency>
  2. 添加配置application.properties):

    sms.api-key=YOUR_API_KEY
    sms.endpoint=https://custom.sms.api # 可选(覆盖默认值)
  3. 直接注入使用

    @RestController
    public class MyController {
    private final SmsService smsService; public MyController(SmsService smsService) {
    this.smsService = smsService;
    } @PostMapping("/send")
    public void sendSms() {
    smsService.send("Hello World!");
    }
    }

关键注意事项

  1. 避免包扫描冲突

    将自动配置类放在独立的包(如 com.example.autoconfigure),避免被主应用的 @ComponentScan 扫描到。

  2. 条件化配置

    合理使用 @Conditional 注解,确保 Starter 只在满足条件时生效。

  3. 提供元数据提示

    META-INF/spring-configuration-metadata.json 中定义配置属性的提示信息,增强 IDE 支持。

  4. 模块化设计

    将 Starter 拆分为 autoconfigurestarter 两个模块,符合官方标准结构。


通过以上设计,自定义 Starter 能够无缝集成 Spring Boot 的自动配置机制,用户只需添加依赖和简单配置即可获得开箱即用的功能。

【自动配置魔法】Spring Boot Starter设计哲学剖析 + 实战自定义Starter全指南的更多相关文章

  1. SpringBoot零XML配置的Spring Boot Application

    Spring Boot 提供了一种统一的方式来管理应用的配置,允许开发人员使用属性properties文件.YAML 文件.环境变量和命令行参数来定义优先级不同的配置值.零XML配置的Spring B ...

  2. spring boot 框架设计步骤

    spring boot 框架设计步骤: 1.poem.xml配置 2.application.yml配置 3.entiry实体 4.realm.Myrealm extends AuthorizingR ...

  3. 精尽Spring Boot源码分析 - 剖析 @SpringBootApplication 注解

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  4. Java Spring Boot VS .NetCore (十一)自定义标签 Java Tag Freemarker VS .NetCore Tag TagHelper

    Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...

  5. 【SFA官方翻译】使用 Kubernetes、Spring Boot 2.0 和 Docker 的微服务快速指南

    [SFA官方翻译]使用 Kubernetes.Spring Boot 2.0 和 Docker 的微服务快速指南 原创: Darren Luo SpringForAll社区 今天 原文链接:https ...

  6. spring boot 和shiro的代码实战demo

    spring boot和shiro的代码实战 首先说明一下,这里不是基础教程,需要有一定的shiro知识,随便百度一下,都能找到很多的博客叫你基础,所以这里我只给出代码. 官方文档:http://sh ...

  7. Spring Boot → 08:嵌入式Servlet容器自定义

    Spring Boot → 08:嵌入式Servlet容器自定义

  8. Spring Boot自动配置与Spring 条件化配置

    SpringBoot自动配置 SpringBoot的自动配置是一个运行时(应用程序启动时)的过程,简化开发时间,无需浪费时间讨论具体的Spring配置,只需考虑如何利用SpringBoot的自动配置即 ...

  9. YAML配置,spring boot 配置文件

    1 概念YAML是一种人们可以轻松阅读的数据序列化格式,并且它非常适合对动态编程语言中使用的数据类型进行编码.YAML是YAML Ain't Markup Language简写,和GNU(" ...

  10. 携程Apollo(阿波罗)配置中心Spring Boot迁移日志组件,使用配置中心进行管理的思路

    说明: 1.Spring Boot项目默认使用logback进行日志管理 2.logback在启动时默认会自动检查是否有logback.xml文件,如果有时会有限加载这个文件. 3.那么如果是用配置中 ...

随机推荐

  1. 代码随想录第十五天 | Leecode 110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和、222. 完全二叉树的节点个数

    Leecode 110. 平衡二叉树 题目描述 给定一个二叉树,判断它是否是 平衡二叉树(是指该树所有节点的左右子树的高度相差不超过 1.) 示例 1: 输入:root = [3,9,20,null, ...

  2. 理解 C# 中的各类指针

    目录 前言 对象引用(Object Reference) 指针(Pointer) 指针的声明和使用 指针可以指向的位置 可以声明指针的位置 指向值类型变量的指针 指向对象引用的指针 指向 GC Hea ...

  3. pytorch中的剪枝操作

    深度学习技术依赖于过参数化模型,这是不利于部署的,相反,生物神经网络是使用高效的稀疏连接的. 通过减少模型中的参数数量来压缩模型的技术非常重要,为减少内存.电池和硬件的消耗,而牺牲准确性,实现在设备上 ...

  4. codeup之字符串求最大值

    Description 从键盘上输入3个字符串,求出其中最大者. Input 输入3行,每行均为一个字符串. Output 一行,输入三个字符串中最大者. Sample Input Copy Engl ...

  5. Redis的zset底层数据结构,为什么用跳跃表而不用红黑树?

       共同点:红黑树和跳表的插入.删除.查找以及迭代输出的时间复杂度是一样的. 跳表在区间查询的时候效率是高于红黑树的,它查找时,以O(logn)的时间复杂度定位到区间的起点,然后在原始链表往后遍历就 ...

  6. docker部署mysql5.7后登录时出现Access denied for user 'root'@'localhost' (using password: YES)的解决方法

    1.先进去容器中安装vim工具 docker exec -it mysql bash apt-get update apt-get -y install vim 2.修改/etc/mysql/conf ...

  7. C# Task 取消执行的简单封装

    我让DeepSeek帮我写了一段使用 CancellationTokenSource 取消任务的简单示例如下: 取消任务的简单示例 using System.Threading.Tasks; usin ...

  8. 「Temp」CSP-S 2023 JL 迷惑代码大赏

    (欢迎投稿.) 在 \(213\) 份代码中共查找到 \(21\) 个 //freopen,来自 JL-S00031.JL-S00045.JL-S00047.JL-S00085.JL-S00123.J ...

  9. Kubernetes小试牛刀(安装)

    1.Kubernetes简介 Kubernetes,是一个全新的基于容器技术的分布式架构领先方案,是Google严格保密十几年的秘密武器--Borg系统的一个开源版本,于2014年9月发布第一个版本, ...

  10. 手把手教你网络爬虫(爬取豆瓣电影top250,附带源代码)

    概念 网络爬虫就是按照一定的规则,自动抓取互联网信息的程序或脚本.其本质就是模拟浏览器打开网页,获取网页中我们需要的数据. 基本流程 准备工作(构建流程) 获取数据 解析内容 保存数据 1. 准备工作 ...