【自动配置魔法】Spring Boot Starter设计哲学剖析 + 实战自定义Starter全指南
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)实现条件化配置。 - 流程:
- Spring Boot 启动时扫描
META-INF/spring.factories文件中定义的自动配置类。 - 根据当前项目的类路径、已存在的 Bean 等条件,动态决定是否启用配置。
- Spring Boot 启动时扫描
- 示例:当类路径存在
DataSource.class时,自动配置嵌入式数据库(如 H2)。
3. 配置属性绑定
- 原理:通过
@ConfigurationProperties将application.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:实现自动配置模块
添加 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>
定义配置属性类:
@ConfigurationProperties(prefix = "sms")
public class SmsProperties {
private String apiKey;
private String endpoint = "https://api.sms.com";
// Getters and Setters
}
实现业务服务:
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
}
}
创建自动配置类:
@Configuration
@EnableConfigurationProperties(SmsProperties.class)
@ConditionalOnClass(SmsService.class) // 当 SmsService 在类路径时生效
public class SmsAutoConfiguration { @Bean
@ConditionalOnMissingBean // 容器中无 SmsService 时创建
public SmsService smsService(SmsProperties properties) {
return new SmsService(properties);
}
}
注册自动配置类:
在resources/META-INF/spring.factories中添加:org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.sms.autoconfigure.SmsAutoConfiguration
步骤 3:创建 Starter 模块
- 仅需一个 POM 文件:
<project>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>sms-spring-boot-autoconfigure</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</project>
步骤 4:测试自定义 Starter
在项目中引入 Starter:
<dependency>
<groupId>com.example</groupId>
<artifactId>sms-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
添加配置(
application.properties):sms.api-key=YOUR_API_KEY
sms.endpoint=https://custom.sms.api # 可选(覆盖默认值)
直接注入使用:
@RestController
public class MyController {
private final SmsService smsService; public MyController(SmsService smsService) {
this.smsService = smsService;
} @PostMapping("/send")
public void sendSms() {
smsService.send("Hello World!");
}
}
关键注意事项
避免包扫描冲突:
将自动配置类放在独立的包(如com.example.autoconfigure),避免被主应用的@ComponentScan扫描到。条件化配置:
合理使用@Conditional注解,确保 Starter 只在满足条件时生效。提供元数据提示:
在META-INF/spring-configuration-metadata.json中定义配置属性的提示信息,增强 IDE 支持。模块化设计:
将 Starter 拆分为autoconfigure和starter两个模块,符合官方标准结构。
通过以上设计,自定义 Starter 能够无缝集成 Spring Boot 的自动配置机制,用户只需添加依赖和简单配置即可获得开箱即用的功能。
【自动配置魔法】Spring Boot Starter设计哲学剖析 + 实战自定义Starter全指南的更多相关文章
- SpringBoot零XML配置的Spring Boot Application
Spring Boot 提供了一种统一的方式来管理应用的配置,允许开发人员使用属性properties文件.YAML 文件.环境变量和命令行参数来定义优先级不同的配置值.零XML配置的Spring B ...
- spring boot 框架设计步骤
spring boot 框架设计步骤: 1.poem.xml配置 2.application.yml配置 3.entiry实体 4.realm.Myrealm extends AuthorizingR ...
- 精尽Spring Boot源码分析 - 剖析 @SpringBootApplication 注解
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- 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 ...
- 【SFA官方翻译】使用 Kubernetes、Spring Boot 2.0 和 Docker 的微服务快速指南
[SFA官方翻译]使用 Kubernetes.Spring Boot 2.0 和 Docker 的微服务快速指南 原创: Darren Luo SpringForAll社区 今天 原文链接:https ...
- spring boot 和shiro的代码实战demo
spring boot和shiro的代码实战 首先说明一下,这里不是基础教程,需要有一定的shiro知识,随便百度一下,都能找到很多的博客叫你基础,所以这里我只给出代码. 官方文档:http://sh ...
- Spring Boot → 08:嵌入式Servlet容器自定义
Spring Boot → 08:嵌入式Servlet容器自定义
- Spring Boot自动配置与Spring 条件化配置
SpringBoot自动配置 SpringBoot的自动配置是一个运行时(应用程序启动时)的过程,简化开发时间,无需浪费时间讨论具体的Spring配置,只需考虑如何利用SpringBoot的自动配置即 ...
- YAML配置,spring boot 配置文件
1 概念YAML是一种人们可以轻松阅读的数据序列化格式,并且它非常适合对动态编程语言中使用的数据类型进行编码.YAML是YAML Ain't Markup Language简写,和GNU(" ...
- 携程Apollo(阿波罗)配置中心Spring Boot迁移日志组件,使用配置中心进行管理的思路
说明: 1.Spring Boot项目默认使用logback进行日志管理 2.logback在启动时默认会自动检查是否有logback.xml文件,如果有时会有限加载这个文件. 3.那么如果是用配置中 ...
随机推荐
- 代码随想录第十五天 | Leecode 110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之和、222. 完全二叉树的节点个数
Leecode 110. 平衡二叉树 题目描述 给定一个二叉树,判断它是否是 平衡二叉树(是指该树所有节点的左右子树的高度相差不超过 1.) 示例 1: 输入:root = [3,9,20,null, ...
- 理解 C# 中的各类指针
目录 前言 对象引用(Object Reference) 指针(Pointer) 指针的声明和使用 指针可以指向的位置 可以声明指针的位置 指向值类型变量的指针 指向对象引用的指针 指向 GC Hea ...
- pytorch中的剪枝操作
深度学习技术依赖于过参数化模型,这是不利于部署的,相反,生物神经网络是使用高效的稀疏连接的. 通过减少模型中的参数数量来压缩模型的技术非常重要,为减少内存.电池和硬件的消耗,而牺牲准确性,实现在设备上 ...
- codeup之字符串求最大值
Description 从键盘上输入3个字符串,求出其中最大者. Input 输入3行,每行均为一个字符串. Output 一行,输入三个字符串中最大者. Sample Input Copy Engl ...
- Redis的zset底层数据结构,为什么用跳跃表而不用红黑树?
共同点:红黑树和跳表的插入.删除.查找以及迭代输出的时间复杂度是一样的. 跳表在区间查询的时候效率是高于红黑树的,它查找时,以O(logn)的时间复杂度定位到区间的起点,然后在原始链表往后遍历就 ...
- 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 ...
- C# Task 取消执行的简单封装
我让DeepSeek帮我写了一段使用 CancellationTokenSource 取消任务的简单示例如下: 取消任务的简单示例 using System.Threading.Tasks; usin ...
- 「Temp」CSP-S 2023 JL 迷惑代码大赏
(欢迎投稿.) 在 \(213\) 份代码中共查找到 \(21\) 个 //freopen,来自 JL-S00031.JL-S00045.JL-S00047.JL-S00085.JL-S00123.J ...
- Kubernetes小试牛刀(安装)
1.Kubernetes简介 Kubernetes,是一个全新的基于容器技术的分布式架构领先方案,是Google严格保密十几年的秘密武器--Borg系统的一个开源版本,于2014年9月发布第一个版本, ...
- 手把手教你网络爬虫(爬取豆瓣电影top250,附带源代码)
概念 网络爬虫就是按照一定的规则,自动抓取互联网信息的程序或脚本.其本质就是模拟浏览器打开网页,获取网页中我们需要的数据. 基本流程 准备工作(构建流程) 获取数据 解析内容 保存数据 1. 准备工作 ...