在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项目的目录结构如下。
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为例,其它三个都类似,就不再一一赘述了。
@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. 创建配置属性类
@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 文件,内容格式如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.example.HttpClientAutoConfiguration
这个文件的作用是让 Spring Boot 在启动时扫描到我们定义的自动配置类,从而应用相应的配置。
6. 构建和测试项目
使用 Maven 构建工具将项目打包成 jar 文件,然后在一个测试的 Spring Boot 项目中引入这个 jar 文件作为依赖,启动项目,观察是否按照预期完成了自动配置,功能是否正常工作。同时,编写相应的单元测试和集成测试用例来验证 starter 的各项功能是否正确可靠。
如何引入自己写的starter
引入最常用的有两种方式,一种是本地引入,一种是发布到远程仓库。
1. 本地引入
- 安装到本地Maven仓库
在 starter 项目根目录下执行 mvn clean install 命令即可。
mvn clean install
- 在其它项目中引用
然后,在其它的Spring Boot项目中,通过pom.xml添加依赖项:
<dependency><groupId>com.zk</groupId><artifactId>http-toolkit-starter</artifactId><version>1.0.0-SNAPSHOT</version>
</dependency>
2. 发布到远程仓库(nexus或artifactory)
- 发布到公司私有Maven仓库
<distributionManagement><repository><id>internal.repo</id><url>http://your-company-repo/repository/internal</url></repository>
</distributionManagement>
使用以下命令发布:
mvn clean deploy
- 在项目中引用远程库
一旦发布到远程仓库,其他项目可以像普通依赖一样在pom.xml里添加:
<dependency><groupId>com.zk</groupId><artifactId>http-toolkit-starter</artifactId><version>1.0.0-SNAPSHOT</version>
</dependency>
除了上述两种方式,还有一种方式,我们可以将Starter的Jar文件手动复制到另一个项目的libs目录,并在pom.xml中通过systemPath引用:
<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,并且能够在项目中方便地引入和使用。