【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,则是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主要做了以下事情:

  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将要封装的库。

<!-- 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易于使用和维护。

参考

  • 创建自己的启动器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/654595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java类和对象详解

文章目录 一、面向对象初步认识1.1 什么是面向对象 二、类的定义和使用2.1 简单认识类2.2 类的定义格式 三、类的实例化3.1 什么是类的实例化3.2 类和对象的说明 四、对象的构造及初始化4.1 如何初始化对象4.2 构造方法(1) 概念(2) 特性 4.3 默认初始化4.4 就地初始化 本文章&a…

微信小程序px、rpx、vh、百分比单位介绍

目录 px rpx vh 百分比% px px:css长度单位,一般为1/96英寸。 rpx rpx: 可以根据屏幕宽度进行自适应。规定屏幕宽为750rpx。如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375px = 750物理像素,1rpx = 0.5px = 1物理像素。 设备rpx换算px (屏幕宽…

新版MQL语言程序设计:原型模式的原理、应用及代码实现

文章目录 一、什么是原型模式二、为什么需要原型模式三、原型模式实现方法四、原型模式的应用范围及例子五、原型模式的代码实现 一、什么是原型模式 原型模式是一种创建型设计模式&#xff0c;它允许通过复制现有对象来创建新对象&#xff0c;而无需通过实例化类来创建 二、为…

图片中的水印怎么去掉?教你三个去水印方法

在拍摄照片时&#xff0c;有时候会遇到不期而遇的路人出现在镜头中&#xff0c;给照片带来不必要的干扰。这时候我们就需要把路人给去掉&#xff0c;让照片变的更加完美。下面我将给大家分享三个把照片中的路人去掉的小妙招。 一、水印云 水印云是一款非常实用的图片处理工具…

腾讯发表多模态大模型最新综述,从26个主流大模型看多模态效果提升关键方法

在大规模语言模型&#xff08;LLMs&#xff09;通往通用人工智能&#xff08;AGI&#xff09;的道路中&#xff0c;从传统的单一的“语言模态”扩展到“图像”、“语音”等等的“多模态”必然是大模型进化的必经之路。 在过去的 2023 年&#xff0c;多模态大规模语言模型&…

Hotspot源码解析-第28章-终结篇章

第28章-终结篇章 经过前面27章的介绍&#xff0c;终于把Java虚拟机&#xff08;hotspot&#xff09;的运行流程和实现细节都走完了&#xff0c;相信能让读者对Java的运行机制和设计原理有一个全新的认识&#xff0c;众观全网及书籍&#xff0c;似乎没有一人这么系统的逐行对ho…

第2章 战略设计

第2章 战略设计 2-1 智慧零售案例项目介绍2-2 建模和设计的整体流程2-3 如何描述模型&#xff1f;从用户故事到通用语言2-4 SmartRM系统整体战略设计2-5 SmartRM通用语言文档2-6 分解问题&#xff1a;领域划分和子域2-7 确定系统最核心的部分&#xff1a;核心域和精炼2-8 分解模…

【Node-RED】node-red-contrib-opcua-server模块使用(2)

这里写自定义目录标题 前言示例简单介绍变量产生opcuaServe配置 地址空间的配置创建opcua服务器获取命名空间初始化变量定义文件夹定义文件夹中的变量view文件夹增加view文件夹中查阅信息定义最终效果 加密设置opcuaServe组件配置客户端配置 参考官网博文 前言 上期博文【Node…

零基础学编程,中文编程入门视频教程

零基础学编程&#xff0c;中文编程入门视频教程 一、前言 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 编程工具及实例源码文件下载可以点击最下方官网卡片——软件下载——常用工具下载——编程工具免费版下载及实例源码下载。 如上图为编程工具构件…

c语言实战之贪吃蛇

文章目录 前言效果展示游戏用到的图片游戏思路一览游戏前准备一、贪吃蛇、食物、障碍物节点坐标的结构体二、枚举游戏状态、和贪吃蛇的方向三、维护运行的结构体 游戏开始前的初始化一、学习图形库相关知识二、设置背景三、欢迎界面四、初始化贪吃蛇五、生成障碍物六、生成食物…

Codeforces Round 811 (Div. 3)(VP-15,寒假加训)

A. 模拟 // Problem: A. Everyone Loves to Sleep // Contest: Codeforces - Codeforces Round 811 (Div. 3) // URL: https://codeforces.com/group/RAx5fiilkP/contest/1714/problem/A // Memory Limit: 256 MB // Time Limit: 2000 ms // // Powered by CP Editor (https…

SharedPreferences卡顿分析

SP的使用及存在的问题 SharedPreferences(以下简称SP)是Android本地存储的一种方式&#xff0c;是以key-value的形式存储在/data/data/项目包名/shared_prefs/sp_name.xml里&#xff0c;SP的使用示例及源码解析参见&#xff1a;Android本地存储之SharedPreferences源码解析。以…

【JAVA语言-第16话】集合框架(三)——Set、HashSet、LinkedHashSet、TreeSet集合的详细解析

目录 Set集合 1.1 概述 1.2 特点 1.3 HashSet集合 1.3.1 概述 1.3.2 哈希表 1.3.3 哈希值 1.3.4 练习 1.3.5 HashSet存储自定义类型元素 1.4 LinkedHashSet集合 1.4.1 概述 1.4.2 特点 1.4.3 练习 1.5 TreeSet集合 1.5.1 概述 1.5.2 练习 1.6 HashSet、Lin…

Pandas展开数据

def testExplode():df = pd.DataFrame({key: [A, B],data: [[1

【论文复现】

code&#xff1a; paper&#xff1a; 论文 介绍 方法 实验 结论 复现 Image generation 问题1&#xff1a;No models "dcface/dcface/pretrained_models/adaface_ir101_webface4m.ckpt Traceback (most recent call last):File "/data/dcface/dcface/src/r…

线性回归需要满足的几个假设

线性回归模型是基于一些假设构建的&#xff0c;这些假设有助于确保模型的有效性和可解释性。以下是线性回归需要满足的几个主要假设&#xff1a; 线性关系假设&#xff08;Linearity&#xff09;: 线性回归假设因变量&#xff08;目标变量&#xff09;与自变量&#xff08;特征…

如何通俗解释Docker是什么?

要想弄懂Docker&#xff0c;咱们得先从“容器化”讲起。 一、容器化技术及Docker的出现 容器化&#xff0c;它是一种轻量级、可移植的软件打包方式&#xff0c;你就想象成一个快递箱子&#xff0c;里面装着你的应用和所有需要运行的环境&#xff0c;这个箱子能在任何支持容器…

Redisson分布式锁介绍及实战应用(防止缓存击穿)

本地锁 浏览器把100w请求由网关随机往下传&#xff0c;在集群情况下&#xff0c;每台服务都放行10w请求过来&#xff0c;这时候每台服务都用的是本地锁是跨JVM的&#xff0c; 列如这些服务都没有49企业&#xff0c;此时有几个服务进行回原了打击在DB上面&#xff0c;那后期把这…

Blender教程(基础)-物体的移动、旋转与缩放-04

一、新建一个立方体 ShiftA新建一个立方体用来演示。 二、物体的移动 xyz轴移动 点击下图图左侧的移动选项后&#xff0c;选中要移动的物体&#xff0c;会出现三个箭头的方向&#xff0c;这分别代表沿着x、y、z轴移动。xyz平面移动 这个小正方体代表沿着某一个面移动&#…

AWS 专题学习 P14 (Security Encryption)

文章目录 专题总览为什么需要加密&#xff1f;AWS KMS&#xff08;密钥管理服务&#xff09;KMS 密钥类型AWS KMS&#xff08;密钥管理服务&#xff09;Copying Snapshots across regionsKMS Key Policies在不同账户之间复制快照KMS Multi-Region Keys (多区域密钥)DynamoDB 全…