一分钟上手:如何创建你的第一个 Spring Boot Starter

在SpringBoot项目开发过程中,我们常常会使用各种starter来快速集成不同的功能,简化配置,提高开发效率。本文将带你手动实现一个Spring Boot的starter。

什么是SpringBoot的starter?

Spring Boot 的 starter 本质上是一种依赖管理和自动配置 的机制。它将一组相关的依赖库整合在一起,并提供了默认的配置,使得开发者在需要使用特定功能时,只需简单地在项目中引入对应的 starter,Spring Boot 就能自动完成配置,让相应的功能开箱即用,无需手动去配置繁多复杂的各种依赖参数。

常用的SpringBoot的starter

Spring Boot 官方提供了大量丰富的 starter,涵盖了众多不同的应用场景,以下是一些比较常用的:

1. spring-boot-starter-web

用于构建 Web 应用程序的基础 starter。引入它后,Spring Boot 会自动配置好内嵌的 Web 服务器(比如 Tomcat、Jetty 等),并整合 Spring MVC 框架,方便我们快速开发 RESTful API 或者传统的 Web 页面应用。它内部包含了处理 HTTP 请求、视图解析、静态资源管理等相关的依赖和配置

2. spring-boot-starter-actuator

提供应用程序监控和管理功能,例如健康检查、度量指标和更多信息的端点。

3. spring-boot-starter-security

提供安全功能支持,包括基本身份认证和授权。

4. spring-boot-starter-test

用于项目的测试环节,整合了如 JUnit、Mockito、Spring Test 等一系列测试相关的库和工具,方便我们编写单元测试、集成测试等不同类型的测试用例,确保项目的功能正确性和稳定性。

5. spring-boot-starter-logging:

默认包含在Spring Boot项目中,用于日志功能,整合了Logback和Java Util Logging。

6. spring-boot-starter-validation:

用于Bean验证的支持,集成Hibernate Validator。

7. spring-boot-starter-aop

支持面向切面编程(AOP),提供了 Spring AOP 的相关依赖。

8. spring-boot-starter-jdbc

用于使用 JDBC 访问数据库,提供了 DataSource 和 JDBC Template 的配置。

9. spring-boot-starter-redis

用于与 Redis 数据库交互,支持缓存、队列等功能。

10. spring-boot-starter-data-mongodb

用于集成MongoDB数据库支持。

11. spring-boot-starter-cache

用于启用缓存支持,支持多种缓存方案(如EhCache、Caffeine等)。

如何从0-1写一个starter?

1. 确定starter的功能和依赖

首先要明确想要的这个 starter 实现的具体功能是什么 ,比如是用于连接某个特定的第三方服务,还是提供一种特定的业务逻辑组件等。然后根据这个功能需求,梳理出需要引入哪些依赖库

本文实现了一个集成了各种常用HTTP客户端的starter,可以显著简化开发者在不同项目中对HTTP客户端的使用和配置,以下是具体实现步骤。

SpringBoot常用Http客户端的异同可见《SpringBoot 项目高效 HTTP 通信:常用客户端大比拼!》

2. 创建maven项目

使用maven创建的springboot项目的目录结构如下。

java 复制代码
http-toolkit-starter/
    ├── src/
    │   ├── main/
    │   │   ├── java/
    │   │   │   └── com/zk/httptoolkit/
    │   │   │       ├──HttpToolkitStarterAutoConfiguration.java
    │   │   │       └──...(其他相关类)
    │   │   └── resources/
    │   │       ├── META-INF/
    │   │       │   └── spring.factories
    │   │       └── application.yml(用于默认配置)
    │   └── test/(用于编写测试用例)
    ├── pom.xml(Maven 项目)
    └── README.md(项目说明文档)

其中,HttpToolkitStarterAutoConfiguration.java 这个类是实现自动配置功能的核心,spring.factories 文件则用于告诉 Spring Boot 在启动时去加载我们定义的自动配置类。

3. 创建自动配置类

为每个集成的HTTP客户端创建一个自动配置类,包括:

  • Apache HttpClient
  • OkHttp
  • RestTemplate(Spring自带)
  • WebClient(Spring WebFlux)

本文以Apache HttpClient为例,其它三个都类似,就不再一一赘述了。

java 复制代码
@Configuration
@ConditionalOnClass(HttpClient.class) // 只在类路径下有HttpClient时激活
@EnableConfigurationProperties(HttpClientProperties.class)
public class HttpClientAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean  // 如果容器中不存在 HttpClient 类型的 Bean,则创建一个
    public HttpClient createHttpClient(HttpClientProperties properties) {
        RequestConfig config = RequestConfig.custom()
                                            .setConnectTimeout(properties.getConnectTimeout())
                                            .setSocketTimeout(properties.getSocketTimeout())
                                            .build();
        return HttpClients.custom()
                          .setDefaultRequestConfig(config)
                          .build();
    }
}

4. 创建配置属性类

java 复制代码
@ConfigurationProperties(prefix = "http.toolkit")
public class HttpClientProperties {
    private int connectTimeout = 1000;
    private int socketTimeout = 3000;

    // Getters and Setters
}

5. 配置 spring.factories 文件

在 src/main/resources/META-INF 目录下创建 spring.factories 文件,内容格式如下:

java 复制代码
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.example.HttpClientAutoConfiguration

这个文件的作用是让 Spring Boot 在启动时扫描到我们定义的自动配置类,从而应用相应的配置。

6. 构建和测试项目

使用 Maven 构建工具将项目打包成 jar 文件,然后在一个测试的 Spring Boot 项目中引入这个 jar 文件作为依赖,启动项目,观察是否按照预期完成了自动配置,功能是否正常工作。同时,编写相应的单元测试和集成测试用例来验证 starter 的各项功能是否正确可靠。

如何引入自己写的starter

引入最常用的有两种方式,一种是本地引入,一种是发布到远程仓库。

1. 本地引入

  • 安装到本地Maven仓库
    在 starter 项目根目录下执行 mvn clean install 命令即可。
bash 复制代码
mvn clean install
  • 在其它项目中引用
    然后,在其它的Spring Boot项目中,通过pom.xml添加依赖项:
xml 复制代码
<dependency>
    <groupId>com.zk</groupId>
    <artifactId>http-toolkit-starter</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</dependency>

2. 发布到远程仓库(nexus或artifactory)

  • 发布到公司私有Maven仓库
xml 复制代码
<distributionManagement>
    <repository>
        <id>internal.repo</id>
        <url>http://your-company-repo/repository/internal</url>
    </repository>
</distributionManagement>

使用以下命令发布:

bash 复制代码
mvn clean deploy
  • 在项目中引用远程库
    一旦发布到远程仓库,其他项目可以像普通依赖一样在pom.xml里添加:
xml 复制代码
<dependency>
    <groupId>com.zk</groupId>
    <artifactId>http-toolkit-starter</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</dependency>

除了上述两种方式,还有一种方式,我们可以将Starter的Jar文件手动复制到另一个项目的libs目录,并在pom.xml中通过systemPath引用:

xml 复制代码
<dependency>
    <groupId>com.zk</groupId>
    <artifactId>http-toolkit-starter</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/libs/http-toolkit-starter-1.0.0-SNAPSHOT.jar</systemPath>
</dependency>

这种方式一般不推荐在生产环境使用,只适用于本地学习和测试用

通过以上步骤,我们便成功地实现了一个自定义的Spring Boot starter,并且能够在项目中方便地引入和使用。

相关推荐
java干货10 分钟前
虚拟线程与消息队列:Spring Boot 3.5 中异步架构的演进与选择
spring boot·后端·架构
一只叫煤球的猫14 分钟前
MySQL 8.0 SQL优化黑科技,面试官都不一定知道!
后端·sql·mysql
SoFlu软件机器人16 分钟前
智能生成完整 Java 后端架构,告别手动编写 ControllerServiceDao
java·开发语言·架构
写bug写bug1 小时前
如何正确地对接口进行防御式编程
java·后端·代码规范
Cyanto1 小时前
Java并发编程面试题
java·开发语言·面试
不超限1 小时前
Asp.net core 使用EntityFrame Work
后端·asp.net
在未来等你1 小时前
互联网大厂Java求职面试:AI大模型与云原生技术的深度融合
java·云原生·kubernetes·生成式ai·向量数据库·ai大模型·面试场景
豌豆花下猫2 小时前
Python 潮流周刊#105:Dify突破10万星、2025全栈开发的最佳实践
后端·python·ai
sss191s2 小时前
Java 集合面试题从数据结构到 HashMap 源码剖析详解及常见考点梳理
java·开发语言·数据结构