Spring Boot 的 Starter 以及实现一个自定义Starter

news2024/11/19 14:36:30

一、了解 Spring Boot Starter

        Spring Boot Starter 是 Spring Boot 中一个重要概念,它是一种提供依赖项的方式,简化 Spring 应用程序依赖管理,将一组相关的依赖项打包在一起,并提供一个依赖项描述文件,使开发人员可以快速集成。关于应用场景说白了,就是可以帮助开发人员快速集成各种第三方库和框架。

        Spring Boot Starter 核心原理是 Spring Boot 自动配置机制,它是 Spring Boot 的一个重要特性,也是实现 Spring Boot Starter 关键。具体来说,自动配置机制会根据 classpath 上存在的 jar 包和配置文件,自动创建 Spring Bean,完成对应的配置。开发人员只需要引入对应的 Starter,就能够自动配置所需的 Bean,不需要手动编写配置文件。

常用的 Spring Boot Starter 如下:

spring-boot-starter-web

用于构建Web的入门工具,包括使用Spring MVC构建Web(包括RESTful)的应用程序。使用 Tomcat 作为默认的嵌入式容器

spring-boot-starter-test

用于测试Spring Boot应用程序的入门程序,包括JUnit,Hamcrest和Mockito等库

spring-boot-starter-data-rest

使用Spring Data REST通过REST公开Spring Data Repository的入门程序

spring-boot-starter-freemarker

使用 FreeMarker 视图构建 MVC Web 应用程序的入门器

详细介绍请移步:
Starter官网 (spring.io)

二、Spring Boot Starter 的实现原理

Spring Boot Starter 的实现原理可以分为两个方面:Maven 依赖管理和自动配置。

Maven 依赖管理

        在 Maven 中,Starter 是一个 POM 文件,定义了一组依赖项和插件,用于配置和管理应用程序的依赖项。例如,对于 Spring Boot Web Starter,它包含以下依赖项:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <version>2.6.2</version>
</dependency>

        这个依赖项将会引入一组 Spring MVC 相关的依赖项,包括 Spring Web、Tomcat、Jackson 等。而这些依赖项会在应用程序启动时自动配置,使得开发人员无需手动配置。

自动配置

        Spring Boot 的自动配置是基于条件化配置(Conditional Configuration)机制实现的。条件化配置允许开发人员定义一组条件,当这些条件满足时,自动配置模块会被启用。

例如,对于 Spring Boot Web Starter,它包含以下条件化配置类:

@ConditionalOnWebApplication
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class })
@ConditionalOnMissingBean({ Servlet.class, DispatcherServlet.class })

这些条件表示该 Starter 适用于 Web 应用程序,并且在类路径中存在 Servlet 和 DispatcherServlet 类,同时不存在与这些类相关的 Bean。如果这些条件都满足,自动配置模块就会被启用,并为应用程序自动配置一些基本的 Web 相关功能。

三、使用 Starter (快速入门)

        这个比较简单,直接将需要的需要使用的依赖加入到pom.xml文件中(就不截图举例子了),但如果是引用别人封装好的依赖则需要这样写:(这样的写法主要是 这个依赖没有上传到 Maven 仓库中去),如果上传到maven仓库则需要,配置nexus私服,进行后续操作。

四、自己实现一个 Starter ,自定义Starter(知识应用)

        Spring Boot提供了很多已经集成好的starter,如spring-boot-starter-web、
spring-boot-starter-data-jpa等,我们也可以开发自定义的starter来集成自己的组件和依赖项。

开发自定义starter的步骤如下:

1、创建一个maven项目,命名为xxxx-spring-boot-starter,其中xxxx为组件的名称。(官方的maven项目,命名为 spring-boot-starter-xxxx ,其中xxxx为组件的名称)

 

在项目的pom.xml文件中添加spring-boot-starter-parent依赖,以及spring-boot-starter依赖,用于引入Spring Boot框架和相关组件。

2、创建一个自动配置类,该类需要使用@Configuration和@EnableConfigurationProperties注解,并在其中定义需要自动配置的组件。

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Description:
 * Spring Boot中的自动配置主要是通过@Configuration注解实现的 @Configuration注解用于指示Spring容器使用一个类作为配置类
 * 类中的@Bean方法可以用来定义Spring组件。
 */
@Configuration
@EnableConfigurationProperties(MyStarterProperties.class)

/**
 * Description:
 * 当类路径classpath下有指定的类的情况下进行自动配置 ,Spring Boot的自动配置机制通过在classpath中查找META-INF/spring.factories文件来实现。
 * 该文件中定义了Spring Boot应用程序所需的所有自动配置类。当应用程序启动时,Spring Boot框架会自动加载并运行这些自动配置类。
 */
@ConditionalOnClass(MyStarter.class)

/**
 * Description: 配置文件中matchIfMissing =true时进行自动配置
 */

//第二步:定义/创建一个自动配置类,MyStarterServiceAutoConfiguration
@ConditionalOnProperty(prefix = "spring.mystarter", value = "enabled", matchIfMissing = true)
public class MyStarterServiceAutoConfiguration {
    @Autowired
    private MyStarterProperties myproperties;

    @Bean
    /**
     * Description: 当容器中没有指定Bean的情况下,自动配置MyStarterService类
     * 在加载自动配置类的过程中,Spring Boot框架会对每个@Configuration注解的类进行解析,并通过条件判断决定是否需要执行该类中的@Bean方法。
     * 如果条件满足,则会自动创建该组件,并将其加入到Spring容器中。
     */
    @ConditionalOnMissingBean(MyStarter.class)
    public MyStarter MyStarterService(){
        MyStarter myStarterService = new MyStarter(myproperties);
        return myStarterService;
    }
}

 当然这个demo 相应的还有一些补充(这个地方,对于不同的starter 情况都不一样)

3、在src/main/resources/META-INF/spring.factories文件中添加自动配置类的全限定名。(spring.factories文件必须要在classpath路径(resources)下的/META-INF文件夹下,并且名字必须为spring.factories。这是因为springboot自动装配机制就是通过这个路径下的spring.factories文件去加载类或者依赖的。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.demo.MyStarterServiceAutoConfiguration

4、发布starter

        自定义starter的开发流程就是这样,可以根据自己的实际需求,将需要的依赖进行封装,并开发自动配置类和配置文件,最终将其打包成jar包,上传到maven中央仓库或私有仓库中,就可以供其他开发者使用了。需要注意的是,在开发自定义starter时,应遵循Spring Boot的约定大于配置的原则,并且要充分测试自动配置类的正确性和可用性,以确保自定义starter可以在不同的环境中正确地使用。

5、编写测试类测试

 先把starter 依赖导入,(由于我没有上传到maven 仓库中去,就放在了我电脑的本地maven 仓库中去,但别人使用就不方便,实际开发操作应该不会这样)

然后,输入参数进行测试 

 测试完成

 

五、踩坑

不要这样去引入依赖,一旦clean ,又要重新导入了

 

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

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

相关文章

视觉-激光融合SLAM :LVI - SAM与LIO - SAM的环境配置

目录 1.LIO-SAM配置 1.1 ROS 安装 1.2 安装gtsam 4.0.2 1.3 安装LIO-SAM 1.4 运行LIO-SAM 2. LVI - SAM安装 2.1 一些依赖库的安装 2.2 安装ceres1.1.14 2.3 安装LVI-SAM 1.LIO-SAM配置 机器&#xff1a;Ubuntu 18.04 内存&#xff1a;>16G CPU&#xff1a;Intel &…

电脑看不了视频?这样做,可以快速解决!

案例&#xff1a;我的电脑播放不了视频&#xff0c;这是什么原因。如何才能在电脑上播放视频&#xff1f;有没有解决的办法&#xff1f; 【我工作和学习都离不开电脑&#xff0c;今天工作的时候&#xff0c;我用电脑打开一个视频&#xff0c;却发现视频无法播放&#xff0c;怎…

擎创动态 | 来自华为的深度认可,擎创再获华为鲲鹏技术认证

在数字中国的信息技术应用国产化进程中&#xff0c;擎创科技除持续投入自主产品研发外&#xff0c;还深度适配了涵盖芯片、服务器、操作系统、数据库、中间件、云服务、应用等领域的国产化产品&#xff0c;与华为的合作适配便是其中重要的一环。近期&#xff0c;擎创夏洛克智能…

Install Prometheus Monitoring On Kubernetes Cluster

目录 Node & Software & Docker Images Lists ​Prometheus introduction Download Kubernetes Prometheus Manifest Files Install Prometheus Monitoring Kubernetes Create a Namespace Create a Cluster Role And Binding It Create a Config Map Create…

lwIP更新记05:核心应用文件移动

从 lwIP-2.0.0 开始&#xff0c;lwIP 开发者将一些核心应用从 contrib 仓库移动到 lwIP 仓库的 src/apps 文件夹。 对比版本 lwIP-1.4.1 和 lwIP-2.1.2 的 src 文件夹内容&#xff0c;可以发现 lwIP 2.1.2 版本多了一个 apps 文件夹。 最开始&#xff0c;也就是 2015 年 10 …

【王道·操作系统】第一章计算机系统概述【未完】

一、 操作系统的基本概念 1.1 概念&#xff08;定义&#xff09;&#xff1a;什么是操作系统 操作系统operating system,OS&#xff1a;控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理地组织调度计算机的工作和资源的分配&#xff1b;以提供给用户和其他软件方…

LC 谐振电路

LC电路是各种电子设备中的基本电子组件&#xff0c;尤其是在诸如调谐器&#xff0c;滤波器&#xff0c;混频器和振荡器之类的电路中使用的无线电设备中。在学习之前&#xff0c;我们复习一下电感和电容的原理。 电容就是储存电荷的容器&#xff0c;最基本构成是如下图所示的一个…

uniapp使用express连接mysql数据库

一、安装 express 脚手架 使用winR再输入cmd打开命令提示符&#xff0c;输入如下内容全局安装脚手架 npm i express-generator -g 二、在项目根目录下创建服务 可以在命令提示符中cd到自己项目的根目录下&#xff0c;也可以在HBuilder X里内置的终端运行代码 C:\HBuilderProj…

波奇学C++:动态内存管理,new和delete

内存分区 内存可分为栈&#xff0c;堆&#xff0c;静态区/数据段&#xff0c;常量区/代码段 栈&#xff1a;函数栈帧&#xff0c;临时变量&#xff0c;开辟空间 堆&#xff1a;动态申请的数据 静态区/数码段&#xff1a;静态数据&#xff0c;全局变量 常量区/代码段&#x…

django admin后台管理系统上传添加的图片保存到阿里云oss中

目录 一、配置admin上传图片到阿里云oss 二、配置admin后台上传到阿里云oss的图片为自定义名 问题描述&#xff1a;在开发自己的应用/网页前后台时可以调用阿里云oss的接口将图片上传至oss保存和读取&#xff0c;非常方便。但在django自带的admin后台中如何配置添加的图片也上…

视频美颜SDK在直播领域的应用与挑战

目前&#xff0c;视频美颜技术在视频拍摄领域“大展神通”&#xff0c;因为视频美颜SDK可以帮助主播在直播中展现更加美好的形象&#xff0c;吸引更多的观众&#xff0c;并提升用户体验。然而&#xff0c;视频美颜SDK在直播领域的应用也面临着一些挑战。 一、视频美颜SDK在直…

回溯法【2-5】

假设一个推销员问题由下图定义&#xff0c;用回溯法求解 从1号结点出发的相应最短巡回路径&#xff08;每个顶点刚好到达一次&#xff09;。若用bestL表示搜索过程中产生的当前最优解&#xff0c;剪枝函数 L 设计为&#xff1a; L 已走过的路径长度 当前结点相关的最短边 所…

ChatGPT提示工程课程,吴恩达OpenAI

Principle 1: Write clear and specific instructions 使用明确的分隔符&#xff0c;是LLM知道这个某个单独的字段。 前提设置&#xff1a; import openai import osfrom dotenv import load_dotenv, find_dotenv _ load_dotenv(find_dotenv()) # read local .env fileopena…

LeetCode·每日一题·1080. 根到叶路径上的不足节点·递归

作者&#xff1a;小迅 链接&#xff1a;https://leetcode.cn/problems/insufficient-nodes-in-root-to-leaf-paths/solutions/2279048/di-gui-zhu-shi-chao-ji-xiang-xi-by-xun-g-7rfd/ 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 著作权归作者所有。商业转载请联系…

如何使用 VSCode 软件运行C代码

VSCode 的下载和扩展的配置可以参考文章&#xff1a;VSCode 的安装与插件配置。 VSCode 是很好用的编辑器&#xff0c;通过给其配置 MinGW-w64 插件就可以在它上面编译运行C代码了。 在没有配置 MinGW-w64 插件时&#xff0c;在 VSCode 中运行下面的代码后打印如下图所示。 这…

【C语言】C的编译过程预处理

目录 一、 程序的翻译环境和执行环境1、翻译环境预处理编译汇编链接 2、执行环境 二、预处理详解1、预定义符号2、#define#define 语法#define 定义宏#define 替换规则 3、#和##4、宏和函数对比 一、 程序的翻译环境和执行环境 在ANSI C的任何一种实现中&#xff0c;存在两个不…

为什么我们拥有庞大的语言模型,而Vision Transformers的规模却很小?

编者按&#xff1a;本文探讨了语言模型为何会比视觉模型的参数数量大得多的原因&#xff0c;并详细介绍了传统ViT训练方法在扩展时出现不稳定性的问题。 为此&#xff0c;本文介绍了如何改进架构以实现扩展&#xff0c;并讨论了实现模型最优状态的方法。同时&#xff0c;如何在…

Docker部署skywalking9.2版本

注意使用docker部署skywalking和使用tar包部署有点不一样OAP和UI需要分别部署原因是&#xff1a; SkyWalking UI 和 OAP 是 SkyWalking 的两个主要组件&#xff0c;它们之间的关系是前端和后端的关系。SkyWalking UI 是一个 Web 应用程序&#xff0c;它提供了一个漂亮的 UI 界面…

连续降税、人民币结算,巴西潜力爆发!开发细节见内!

本文内容 /CONTENT 01/中巴贸易现状 02/主要进口类别 03/通关和贸易政策 04/市场商业环境 05/本地公司的注册程序 06/巴西的主要节日 最近巴西降低关税&#xff0c;宣布人民币结算。想转市场的朋友不妨考虑巴西。 巴西作为南美洲最大的国家&#xff0c;当地人口占53%(…

ios音频焦点

音频焦点 两个或者两个以上的app可以同时向同一输出流播放音频。系统会将所有音频流混合在一起&#xff0c;但这样会给用户带来很大的困扰。为了避免所有音乐app同时播放&#xff0c;ios引入了“音频焦点”的概念。在ios中&#xff0c;音频焦点是操作系统为了管理音频硬件而引…