Spring:SpringBoot Starter 工作原理详解

一、前言

  通过使用Spring Boot Starter,开发人员可以避免手动查找和添加每个所需的库,从而大大简化了项目的依赖管理。这些starter不仅包含了库依赖,还可能包含自动配置,从而减少了开发人员需要编写的配置代码。

  本文将分析Spring Boot Starter的主要作用,最后通过代码实战手写一个Spring Boot Starter来演示如何自定义自己的starter

二、概述

  Spring Boot Starter包含了实现特定功能所需的所有依赖的库,从而简化了Maven或Gradle等构建配置。每个starter都遵循特定的命名规则,通常是spring-boot-starter-{name},其中{name}表示特定的功能或组件。

  由于SpringBoot官方本身就提供了很多Starter,为了区别那些是官方的,哪些是第三方的,所以SpringBoot官方提出:
  第三方提供的Starter统一用xxx-spring-boot-starter。
  而官方提供的Starter统一用spring-boot-starter-xxx。

三、Spring Boot Starter主要作用

2.1. 对比spring

  在SpringBoot出现之前,如果我们想使用SpringMVC来构建我们的web项目,必须要做的几件事情如下:

  ①. 首先项目中需要引入SpringMVC的依赖

  ②. 在web.xml中注册SpringMVC的DispatcherServlet,并配置url映射

  ③. 编写springmcv-servlet.xml,在其中配置SpringMVC中几个重要的组件,处理映射器(HandlerMapping)、处理适配器(HandlerAdapter)、视图解析器(ViewResolver)

  ④. 在applicationcontext.xml文件中引入springmvc-servlet.xml文件

  ⑤. 以上这几步只是配置好了SpringMVC,如果我们还需要与数据库进行交互,就要在application.xml中配置数据库连接池DataSource,如果需要数据库事务,还需要配置TransactionManager…

在导入的starter之后,SpringBoot主要帮我们做了什么事情:

1. 原理:

  Spring Boot Starter的原理主要基于自动配置和依赖管理

  当在项目中引入某个Starter依赖时,Spring Boot会根据该Starter的定义自动配置相应的组件和库,而无需开发人员手动进行繁琐的配置。

  这得益于Spring Boot的自动配置机制,它会自动扫描项目中的依赖,并根据依赖信息自动配置Spring容器和相关的bean。

2. 主要作用:

①. 简化依赖管理:通过引入预定义的依赖项集合,开发人员可以一次性添加多个相关的依赖,而无需手动查找和添加每个单独的依赖。这大大简化了项目的依赖管理过程。

②. 自动配置:Spring Boot Starter包含了一些自动配置的类和配置文件,能够根据项目的需要自动配置Spring Boot应用程序的各种组件。这减少了开发人员需要手动编写的配置代码量,降低了开发和维护的工作量。

③. 约定优于配置:Spring Boot Starter遵循“约定优于配置”的原则,提供了一种标准的配置方式。这意味着开发人员只需要按照Starter的要求进行配置,即可获得默认的配置和功能。当需要定制化配置时,也可以通过覆盖默认配置来实现。

④. 扩展性:Spring Boot还提供了扩展机制,允许开发人员根据特定业务需求或技术栈需求创建自定义的Starter。这使得Spring Boot Starter更加灵活和可定制。

  总的来说,Spring Boot Starter通过简化依赖管理和配置工作,使开发人员能够更快速地构建和部署Spring Boot应用程序,提高了开发效率和项目的可维护性。

四、自定义Spring Boot Starter

1. 创建一个新的Maven项目
  首先,你需要创建一个新的Maven项目。你可以使用IDE(如IntelliJ IDEA或Eclipse)来创建,或者手动创建pom.xml文件。

2. 定义Maven依赖项
  在pom.xml中,你需要添加Spring Boot的依赖项以及任何你的starter需要的库。

<dependencies><!-- 添加Spring Boot Starter依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId><version>${spring-boot.version}</version></dependency><!-- 添加其他必要的依赖项 --><!-- ... -->
</dependencies><!-- ... 其他配置 ... -->
确保替换${spring-boot.version}为实际的Spring Boot版本。

3. 创建自动配置类
  在你的starter项目中,你需要创建自动配置类。这些类通常使用@Configuration和@EnableConfigurationProperties注解,并且可能会包含@Bean方法来创建和配置beans。

package com.demo.config;import com.demo.service.MyService;
import com.demo.service.MyServiceImpl;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@EnableAutoConfiguration
public class MyAutoConfiguration {@Bean@ConditionalOnClass(MyService.class)@ConditionalOnMissingBeanpublic MyService myService() {return new MyServiceImpl();}
}

在这里插入图片描述

4. 创建spring.factories文件
  在src/main/resources/META-INF目录下创建一个spring.factories文件。该文件告诉Spring Boot在自动配置过程中包含哪些配置类。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.demo.config.MyAutoConfiguration

确保每行末尾没有空格,并且使用\来分隔多个配置类(如果有的话)。

在这里插入图片描述

5. 构建并发布Starter
  使用Maven构建你的starter项目,并将生成的JAR文件发布到Maven仓库(可能是私有的或公共的)。
mvn clean install

在这里插入图片描述

6. 在其他项目中使用Starter
  现在,你可以在其他Spring Boot项目中使用你的starter了。只需将starter作为依赖项添加到该项目的pom.xml文件中。

<dependency><groupId>com.example</groupId><artifactId>my-spring-boot-starter</artifactId><version>1.0-SNAPSHOT</version>
</dependency>

在这里插入图片描述

注意事项
  1.确保你的starter遵循良好的命名约定,通常遵循{name}-spring-boot-starter的格式。

  2.使用条件注解(如@ConditionalOnClass、@ConditionalOnMissingBean等)来控制何时应用你的自动配置。

  3.编写清晰的文档,说明starter的功能、如何配置以及如何使用。

  4.考虑为你的starter添加测试,以确保它按预期工作。

  这些步骤提供了一个基本的框架来创建Spring Boot Starter。根据你的具体需求,你可能需要添加更多的自动配置逻辑、属性绑定以及与其他库的集成。

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

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

相关文章

51单片机小车制造过程记录

首先感谢B站up主好家伙vcc的资料。 这次小车做出来虽然资料挺全的&#xff0c;但中间还是犯了很多不该犯的错误。 第一个&#xff0c;物料这次我们搞错了挺多&#xff0c;最离谱的应该是最小系统板都错了。 资料里用的stm32f103c8t6&#xff0c;我们开始买成了stm32f103c8t6。…

QT状态机4-使用并行状态来避免组合爆炸

#include "MainWindow.h" #include "ui_MainWindow.h"MainWindow::MainWindow(QWidget *parent):

慧天卓特:全国干旱情况2024年4月监测分析报告

【本报告通过对2024年4月全国干旱情况的监测统计分析&#xff0c;展示了我公司干旱监测产品的按区域持续精准监测以及未来预测能力】 本报告主要内容如下&#xff1a; 1、全国气象概况&#xff08;本月平均气温和降水量&#xff09;&#xff1b; 2、本月干旱情况概述&#x…

【数据结构】队列的实现(链式)

文章目录 队列1.队列的概念及结构概念结构 2.队列的实现&#xff08;链式结构&#xff09;队列定义初始化队列入队出队获取队头元素获取队尾元素销毁队列判断队列是否为空队列有效个数 完整代码&#xff08;包含测试代码&#xff09;Queue.hQueue.ctest.c 队列 1.队列的概念及…

14.正交向量与子空间

文章目录 1. 四个子空间的相互关系2. 正交向量3. 无解方程求解 1. 四个子空间的相互关系 对于m行n列的矩阵A来说&#xff0c;矩阵A的行空间的秩等于矩阵A的列空间的秩 R a n k ( A ) R a n k ( A T ) r (1) Rank(A)Rank(A^T)r\tag{1} Rank(A)Rank(AT)r(1) A X 0 ; A T X …

HTTP代理可以应用在那些领域呢

HTTP代理是IP代理领域中一个重要组成部分&#xff0c;它基于HTTP协议传输&#xff0c;使用海外服务器帮助用户绕开访问限制&#xff0c;浏览查看海外资讯信息。 HTTP代理可以应用在哪些领域呢&#xff1f; 1.保护使用者隐私 当今越来越数据被上传到网络云端上&#xff0c;用户…

uniapp 微信小程序使用ec-canvas图表

微信小程序中使用到了ec-canvas图表&#xff0c;从DCloud插件市场中下载echarts-for-wx&#xff1b; 在uniapp项目中找到js-sdk文件夹&#xff0c;把其中的uni-ec-canvas放到要用的包的components中。 在文件中导入&#xff1a; 饼图&#xff1a; <template><view…

STM32入门_江协科技_5~6_OB记录的自学笔记_GPIO输出_LED流水灯_蜂鸣器

5. GPIO 输出 5.1. GPIO简介 GPIO&#xff08;General Purpose Input Output&#xff09;通用输入输出口可配置为8种输入输出模式引脚电平&#xff1a;0V~3.3V&#xff0c;部分引脚可容忍5V&#xff08;端口输入5V的电压&#xff0c;之前引脚定义表格中带FT标识的&#xff09…

计算思维的理解

2006年&#xff0c;卡内基梅隆大学周以真教授首次系统性地定义了计算思维。这一年&#xff0c;她在美国计算机权威期刊《Communications of the ACM》上发表了题为《Computational Thinking》的论文&#xff0c;由此开启了计算思维大众化的全新历程。 周以真&#xff08;Jeanne…

Android ndk获取手机内部存储卡的根目录方法

如下所示&#xff1a; 代码语言&#xff1a;javascript jclass envcls env- FindClass("android/os/Environment"); //获得类引用if (envcls nullptr) return 0;//找到对应的类&#xff0c;该类是静态的返回值是FilejmethodID id env- GetStaticMethodID(envcls,…

Windows / Linux 查看计算机支持的最大内存

该操作一般用不到&#xff0c;主要用于给计算机扩展内存用。 一、Windows 系统 以管理员身份运行 cmd 1、查看主板最大支持内存容量 wmic memphysical get maxcapacity /format:value将返回值值是以KB为单位的&#xff0c;除以 1024&#xff0c;再除以 1024&#xff0c;即…

单调栈练习

最大矩形面积 如果栈为空&#xff0c;或者新的元素是大于栈顶元素的&#xff0c;那么新来的元素不会破坏栈的单调性&#xff0c;那么就把这个柱子入栈。 特别注意&#xff1a;这里的s.empty()和s.top().height < a不能调换顺序&#xff0c;包括后面的判断也要先判断栈是否为…

【Qt问题】windeployqt如何提取Qt依赖库

往期回顾 【Qt问题】Qt Creator 如何链接第三方库-CSDN博客 【Qt问题】Qt 如何带参数启动外部进程-CSDN博客 【Qt问题】VS2019 Qt win32项目如何添加x64编译方式-CSDN博客 【Qt问题】windeployqt如何提取Qt依赖库 考虑这个问题主要是&#xff1a;当我们的程序运行好之后&#…

【现代C++】范围库的应用

C20引入了范围库&#xff08;Ranges library&#xff09;&#xff0c;它是标准模板库&#xff08;STL&#xff09;的一个扩展&#xff0c;提供了一种新的方式来处理序列和范围。这个库允许开发者以更声明式的方式编写代码&#xff0c;使得操作序列变得更简洁、更易读。以下是C范…

HTML静态网页成品作业(HTML+CSS)——动漫喜羊羊网页设计制作(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有4个页面。 二、作品演示 三、代…

51 单片机[2-2]:LED闪烁

摘要&#xff1a; 本文使用STC89C52RC单片机实现单个LED闪烁 新建一个项目&#xff0c;具体步骤见[2-1] 分析&#xff1a; 要使 LED 闪烁&#xff08;以D1为例&#xff09;&#xff0c;就要先让 P2 0xfe; 再让 P2 0xff; 先在keil5中把程序写成这样&#xff1a; #include &…

代码随想录——在每个树行中找最大值(Leetcode515)

题目链接 层序遍历 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) …

风电功率预测 | 基于BP神经网络的风电功率预测(附matlab完整源码)

风电功率预测 风电功率预测 | 基于BP神经网络的风电功率预测(附matlab完整源码)完整代码风电功率预测 | 基于BP神经网络的风电功率预测(附matlab完整源码) 基于BP神经网络的风电功率预测是一种常见的方法,它利用BP神经网络模型来预测风电场的发电功率。下面是一个基于BP神经…

SEO之为什么研究关键词(二)

初创企业需要建站的朋友看这篇文章&#xff0c;谢谢支持&#xff1a; 我给不会敲代码又想搭建网站的人建议 新手上云 &#xff08;续上一篇。。。。。&#xff09; 3、寻找有效流量 排名和流量都不是目的&#xff0c;有效流量带来的转化才是目的。就算公司有足够的实力将一些…

010.理解异步性

异步消息传递是响应式系统的一个关键特性。但到底是什么异步性&#xff0c;为什么它对响应式应用程序如此重要?我们的人生注定在许多异步任务中。你可能没有意识到&#xff0c;但你的日常活动如果它们本质上不是异步的&#xff0c;那就太烦人了。要理解什么是异步&#xff0c;…