【SpringBoot3】什么是SpringBoot Starter,创建自己的Starter

文章目录

  • 一、什么是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的主要作用和特点:

  1. 整合依赖:Spring Boot Starter 将与特定功能相关的依赖整合在一起,使得开发者只需要在项目中引入相应的Starter,就可以快速地使用该功能。这大大简化了依赖管理和配置过程。
  2. 自动配置:Spring Boot Starter 提供了自动配置功能,可以根据项目中的依赖和环境自动完成配置。这避免了手动配置的繁琐和易错性,使得开发者能够更加专注于业务逻辑的实现。Starter自动配置了大部分常用场景的默认行为,这样开发者就无需手动设置。例如,添加了数据库相关的Starter后,Spring Boot会自动配置数据库连接和对象关系映射(ORM)
  3. 简化开发:通过Spring Boot Starter 开发者可以快速地构建出独立、可运行的、生产级别的Spring应用程序。它提供了大量预设的配置和功能,使得开发者无需从零开始搭建应用程序。
  4. 可扩展性: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框架的应用程序。它的工作原理主要基于以下两点:

  1. Maven依赖管理:引入Spring Boot Starter实质上就是导入jar包,在Spring Boot启动的时候,它会找到starter jar包中的resources/META-INF/spring.factories文件,根据spring.factories文件中的配置,找到需要自动配置的类。
  2. SPI(Service Provider Interface)机制:SPI是一种实现服务解耦、插件自由插拔的机制。通过一些类加载器,去加载classpath下指定目录文件,文件中定义的有需要加载的类的全权限定名,然后这些类会被识别并加载。

Spring Boot Starter主要完成了两件事:

  1. 引入模块所需的相关jar包。
  2. 自动配置各自模块所需的属性。

总的来说,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,则是REACTIVE
	this.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主要做了以下事情:

  1. 定义了Java编译版本为1.8
  2. 使用UTF-8格式编码
  3. 继承自spring-boot-dependencies,这个里边定义了依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号。
  4. 执行打包操作的配置。
  5. 自动化的资源过滤。
  6. 自动化的插件配置。
  7. 针对 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将要封装的库。


<dependencies>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starterartifactId>
    dependency>
    
dependencies>

3. 编写自动配置

创建一个配置类,使用@Configuration注解,并在必要时使用@Conditional注解来条件化地配置bean。例如:

@Configuration
@ConditionalOnClass({ YourClass.class })
@ConditionalOnProperty(prefix = "your.starter", name = "enabled", havingValue = "true", matchIfMissing = true)
public class YourAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public 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易于使用和维护。

参考

  • 创建自己的启动器

你可能感兴趣的:(SpringBoot,3.0,从入门到精通,spring,boot,starter)