一、如何理解 SpringBoot 的 starter 机制
Spring Boot 的 Starter
机制是其简化开发流程的关键特性之一。通过提供 预配置的依赖项
和 自动配置
支持,这一机制极大地简化了项目的依赖管理
和配置
工作,使得开发者可以更快地搭建应用程序框架,从而能够将更多精力集中在业务逻辑的实现上。
下面是对 starter
机制的一些基本理解:
-
简化依赖管理:
starter
POM(Project Object Model)文件是一些预定义的 Maven 或 Gradle 依赖集合,它们包含了一组特定功能所需的库。例如,spring-boot-starter-web
包含了创建一个 Web 应用所需的所有基础依赖,如 Spring Web MVC, Tomcat, Jackson 等。 -
自动配置:当添加了一个
starter
依赖后,Spring Boot 会自动查找并应用相关的自动配置类。这意味着开发者不需要手动编写复杂的配置来启用某个功能,框架会根据项目的依赖自动设置好大部分的配置。 -
约定优于配置:这是
starter
机制的核心理念之一。Spring Boot 预设了一些合理的默认配置,这样开发者可以不用去关心一些细节配置,从而能够更专注于业务逻辑的实现。 -
可扩展性:尽管
starter
提供了很多方便,但它也支持高度定制化。如果开发者需要对某些默认行为进行调整,可以通过提供自己的配置类来覆盖或扩展自动配置的行为。 -
简化起步引导:
starter
使得开发者能够以最少的配置开始一个新的项目。只需要在pom.xml
或build.gradle
文件中加入相应的starter
依赖,就可以快速启动服务,而无需担心底层依赖之间的兼容性和版本冲突问题。 -
社区生态:Spring Boot 社区提供了大量的
starter
模块,涵盖了从数据库访问到消息队列等众多领域,这极大地丰富了开发者的选择,同时也促进了技术栈的标准化。
二、实现自定义Starter的核心步骤
1. 创建Maven项目或Gradle项目
首先,你需要创建一个新的Maven或Gradle项目来包含你的starter包。
请注意,这个项目是一个库项目,而不是应用程序。此时不应该使用的SpringBoot的打包插件 spring-boot-maven-plugin
,而应该使用Maven默认的打包插件(不添加插件配置即可)。
使用 spring-boot-maven-plugin 打出来的jar包,是一个可运行的应用程序(命令 java -jar xxx.jar 即可运行),不是作为库文件的。
2. 创建自动配置类
根据你的库的功能需求,创建一个或多个自动配置类。这些类会通过@EnableAutoConfiguration
或者@SpringBootApplication
自动注册到Spring容器中。在自动配置类中,导入需要在目标应用启动时自动添加到容器的组件(Bean)。
示例:
package com.example.robot;
import com.example.robot.core.property.RobotProperties;
import com.example.robot.web.service.RobotService;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Import({RobotService.class, RobotProperties.class})
@Configuration
public class RobotAutoConfiguration {
}
示例代码中是通过 @Import
注入,也可以通过 @Bean
导入。结合条件注入注解,还可以实现更加定制化的注入。
3. 指定自动配置类的位置(SPI)
依赖 SpringBoot 的 SPI 机制,应用可以发现自动配置类的位置。用来指定自动配置类的文件,放在META-INF/spring/
目录下,文件名为 org.springframework.boot.autoconfigure.AutoConfiguration.imports
。文件中的内容是自动配置类的全限定名
(包含包名和类名),每个自动配置类独占一行。
注意: META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件,是SpringBoot3版本使用的;之前的SpringBoot版本,配置文件不同。
示例:
此配置文件在 jar 包中的位置:
4. 使用starter
在目标SpringBoot项目中,通过 坐标
引入 自定义Starter
的依赖。此时,自动配置生效,自定义Starter中的组件会在项目启动时,自动注入到容器中。
例如,在目标应用的pom.xml
文件中添加如下依赖:
<dependency>
<groupId>com.example</groupId>
<artifactId>robot-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>