文章目录
- 一、什么是SpringBoot Starter
- 1、介绍
- 2、Starter 命名规则
- 二、Starter 工作原理
- 三、Spring Boot Starter Parent
- 四、如何创建自己的Starter
- 1. 创建项目
- 2. 添加依赖
- 3. 编写自动配置
- 4. 创建`spring.factories`文件
- 5. 添加附加配置属性(可选)
- 参考
一、什么是SpringBoot Starter
1、介绍
Spring Boot Starter 是 Spring Boot 中的一个重要概念,它简化了Spring应用程序的初始化和开发过程。
Starter的主要作用和特点:
- 整合依赖:Spring Boot Starter 将与特定功能相关的依赖整合在一起,使得开发者只需要在项目中引入相应的Starter,就可以快速地使用该功能。这大大简化了依赖管理和配置过程。
- 自动配置:Spring Boot Starter 提供了自动配置功能,可以根据项目中的依赖和环境自动完成配置。这避免了手动配置的繁琐和易错性,使得开发者能够更加专注于业务逻辑的实现。Starter自动配置了大部分常用场景的默认行为,这样开发者就无需手动设置。例如,添加了数据库相关的Starter后,Spring Boot会自动配置数据库连接和对象关系映射(ORM)
- 简化开发:通过Spring Boot Starter 开发者可以快速地构建出独立、可运行的、生产级别的Spring应用程序。它提供了大量预设的配置和功能,使得开发者无需从零开始搭建应用程序。
- 可扩展性:Spring Boot Starter 不仅简化了开发过程,同时也为应用程序的扩展提供了便利。它提供了可扩展的接口和机制,使得开发者可以根据需要添加或修改配置项。
总之,Spring Boot Starter 为开发者提供了一种快速、简便的方式来构建和开发Spring应用程序,它简化了依赖管理、自动配置、默认配置和可扩展性等方面的问题,使得开发者能够更加高效地开发出高质量的应用程序。
2、Starter 命名规则
所有的官方启动器都遵循类似的命名模式:spring-boot-starter-*
,其中*
代表特定类型的应用程序。这种命名结构有助于你在需要查找启动器时进行查找。许多IDE中的Maven集成可以让你按名称搜索依赖项。例如,安装了适当的Eclipse或Spring Tools插件后,你可以在POM编辑器中按ctrl-space
键,然后输入“spring-boot-starter”以获取完整列表。
如“创建自己的启动器”部分所述,第三方启动器不应该以spring-boot开头,因为这是为官方Spring Boot工件保留的。相反,第三方启动器通常以项目的名称开头。例如,名为thirdpartyproject
的第三方启动器项目通常命名为thirdpartyproject-spring-boot-starter
。
二、Starter 工作原理
Spring Boot Starter是Spring Boot提供的一种特殊的依赖管理方式,它可以快速、轻松地创建基于Spring框架的应用程序。它的工作原理主要基于以下两点:
- Maven依赖管理:引入Spring Boot Starter实质上就是导入jar包,在Spring Boot启动的时候,它会找到starter jar包中的resources/META-INF/spring.factories文件,根据spring.factories文件中的配置,找到需要自动配置的类。
- SPI(Service Provider Interface)机制:SPI是一种实现服务解耦、插件自由插拔的机制。通过一些类加载器,去加载classpath下指定目录文件,文件中定义的有需要加载的类的全权限定名,然后这些类会被识别并加载。
Spring Boot Starter主要完成了两件事:
- 引入模块所需的相关jar包。
- 自动配置各自模块所需的属性。
总的来说,Spring Boot Starter的工作原理就是通过Maven依赖管理和SPI机制,实现对Spring框架及其相关库的有效管理,简化和统一依赖管理系统的初始化过程,从而让开发者能够更轻松地定义并配置所需的依赖。
源码解析:
构造函数:初始化web容器,加载ApplicationContextInitializer的实现类并将其实例化,加载ApplicationListener的实现类并将其实例化
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {this.resourceLoader = resourceLoader;Assert.notNull(primarySources, "PrimarySources must not be null");this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));// 初始化web容器类型,默认SERVLET,如果存在org.springframework.web.reactive.DispatcherHandler,则是REACTIVEthis.webApplicationType = WebApplicationType.deduceFromClasspath();this.bootstrapRegistryInitializers = new ArrayList<>(getSpringFactoriesInstances(BootstrapRegistryInitializer.class));//找到*META-INF/spring.factories*中声明的所有ApplicationContextInitializer的实现类并将其实例化setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));//找到*META-INF/spring.factories*中声明的所有ApplicationListener的实现类并将其实例化setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));//获得当前执行main方法的类对象this.mainApplicationClass = deduceMainApplicationClass();
}
三、Spring Boot Starter Parent
Spring Boot Starter Parent 是一个特殊的 starter,它定义了一个Spring Boot 项目的父工程。它提供了很多默认的配置,这些配置可以大大简化我们的开发。
具体来说,Spring Boot Starter Parent主要做了以下事情:
- 定义了Java编译版本为1.8
- 使用UTF-8格式编码
- 继承自spring-boot-dependencies,这个里边定义了依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号。
- 执行打包操作的配置。
- 自动化的资源过滤。
- 自动化的插件配置。
- 针对 application.properties 和 application.yml 的资源过滤,包括通过profile定义的不同环境的配置文件,例如 application-dev.properties 和 application-dev.yml 。
尽管
Java 17
是 Spring Boot 3.0 的最低要求版本,但 spring-boot-starter-parent 将Java编译版本定义为1.8可能是为了保持与现有Spring Boot应用程序和库的兼容性,以及为了提供更好的社区支持和长期维护。
总之,Spring Boot Starter Parent是一个非常重要的依赖管理工具,它为Spring Boot项目提供了一系列的默认配置和功能,使得开发者能够更加高效地开发出高质量的应用程序。
四、如何创建自己的Starter
创建自己的Spring Boot Starter涉及一些关键步骤。这里是一个简化的指南来帮助你开始:
1. 创建项目
首先,创建一个新的Maven或Gradle项目。这个项目将包含你的Starter代码和依赖项。
2. 添加依赖
在项目的pom.xml
(对于Maven)或build.gradle
(对于Gradle)文件中,添加必要的Spring Boot依赖项,以及任何其他你的Starter将要封装的库。
<!-- Maven示例 -->
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- 添加其他依赖 -->
</dependencies>
3. 编写自动配置
创建一个配置类,使用@Configuration
注解,并在必要时使用@Conditional
注解来条件化地配置bean。例如:
@Configuration
@ConditionalOnClass({ YourClass.class })
@ConditionalOnProperty(prefix = "your.starter", name = "enabled", havingValue = "true", matchIfMissing = true)
public class YourAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic YourClass yourClass() {return new YourClass();}
}
4. 创建spring.factories
文件
在你的项目资源目录(通常是src/main/resources
)下创建一个META-INF
文件夹,并在其中创建一个名为spring.factories
的文件。在这个文件中,指定你的自动配置类:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.yourpackage.YourAutoConfiguration
5. 添加附加配置属性(可选)
如果你的Starter需要配置属性,可以创建一个配置属性类,使用@ConfigurationProperties
注解。
@ConfigurationProperties(prefix = "your.starter")
public class YourProperties {private boolean enabled = true;// 其他属性和getter/setter
}
创建自己的Starter需要对Spring Boot的工作方式有深入的了解,特别是自动配置和条件化配置的方面。确保遵循Spring Boot的最佳实践,以确保你的Starter易于使用和维护。
参考
- 创建自己的启动器