如何自定义一个自己的 Spring Boot Starter 组件(从入门到实践)

文章目录

        • 一、什么是 Spring Boot Starter?
        • 二、为什么要自定义 Starter?
        • 三、自定义 Starter 的基本步骤
          • 1. 创建 Maven 项目
          • 2. 配置 `pom.xml`
          • 3. 创建自动配置类
          • 4. 创建业务逻辑类
          • 5. 创建 spring.factories
        • 四、使用自定义 Starter
        • 五、总结
        • 推荐阅读文章

在使用 Spring Boot 开发微服务时,Spring Boot Starter 提供了一种简便的方式来引入各种功能模块。通过 Starter,开发者可以轻松地将所需的依赖和配置封装在一起,简化项目配置。然而,在实际开发中,我们常常需要自定义 Starter,以便满足特定的业务需求。今天,我们就来一起学习如何自定义一个 Spring Boot Starter。

一、什么是 Spring Boot Starter?

Spring Boot Starter 是一组 Maven 依赖的集合,旨在简化 Spring Boot 应用的配置。每个 Starter 通常包括所需的库、自动配置类、属性文件等,使得开发者只需简单地添加一个 Starter,就可以快速启动所需的功能。

例如,spring-boot-starter-web 包含了构建 Web 应用所需的所有依赖,包括 Spring MVC、Jackson 等。

二、为什么要自定义 Starter?

自定义 Starter 主要有以下几个原因:

  1. 复用性:将常用的功能封装为 Starter,方便在多个项目中复用。
  2. 简化配置:将复杂的配置和依赖管理集中处理,减少每个项目中的重复配置。
  3. 团队协作:不同团队可以将各自的功能封装成独立的 Starter,提升项目的模块化程度。
三、自定义 Starter 的基本步骤

接下来,我们将通过创建一个简单的自定义 Starter 来逐步了解其实现过程。我们将创建一个名为 my-spring-boot-starter 的 Starter,它提供一个简单的服务打印消息。

1. 创建 Maven 项目

首先,我们需要创建一个 Maven 项目,命名为 my-spring-boot-starter。项目结构如下:

my-spring-boot-starter
│
├── pom.xml
├── src
│   └── main
│       ├── java
│       │   └── com
│       │       └── example
│       │           └── mystarter
│       │               ├── MyService.java
│       │               └── MyAutoConfiguration.java
│       └── resources
│           └── META-INF
│               └── spring.factories
2. 配置 pom.xml

在 pom.xml 中,添加 Spring Boot 的相关依赖和插件配置:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>my-spring-boot-starter</artifactId><version>1.0.0</version><packaging>jar</packaging><properties><java.version>17</java.version><spring.boot.version>2.7.5</spring.boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

这里引入了 spring-boot-autoconfigure 依赖,它提供了自动配置所需的功能。

3. 创建自动配置类

MyAutoConfiguration.java 中,我们将定义自动配置的逻辑:

package com.example.mystarter;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@EnableAutoConfiguration
public class MyAutoConfiguration {@Beanpublic MyService myService() {return new MyService("Hello from MyService!");}
}

这里,我们创建了一个 MyService 的 Bean,并在其中传递了一条消息。

4. 创建业务逻辑类

MyService.java 中,我们定义一个简单的服务类,用于打印消息:

package com.example.mystarter;public class MyService {private final String message;public MyService(String message) {this.message = message;}public void printMessage() {System.out.println(message);}
}
5. 创建 spring.factories

为了让 Spring Boot 自动加载我们的配置类,我们需要在 src/main/resources/META-INF/spring.factories 文件中添加如下内容:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.mystarter.MyAutoConfiguration

这告诉 Spring Boot 在启动时要加载我们的自动配置类。

四、使用自定义 Starter

完成自定义 Starter 的开发后,我们可以在其他 Spring Boot 项目中使用它。首先,在需要使用该 Starter 的项目中添加 Maven 依赖:

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

接下来,我们可以通过 Spring 上下文获取 MyService 的 Bean,并调用其方法:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemoApplication implements CommandLineRunner {@Autowiredprivate MyService myService;public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}@Overridepublic void run(String... args) throws Exception {myService.printMessage();}
}
五、总结

通过以上步骤,我们成功自定义了一个 Spring Boot Starter,并在其他 Spring Boot 项目中使用它。自定义 Starter 不仅提高了代码的复用性,还简化了项目配置。

自定义 Starter 的关键点

  • 封装依赖和自动配置逻辑。
  • 使用 spring.factories 注册自动配置。
  • 提供易用的接口供用户调用。

希望通过这篇文章,你可以晓得如何自定义一个 Spring Boot Starter,并将其应用于实际项目中。快乐编程😄😄😄!

推荐阅读文章
  • 使用 Spring 框架构建 MVC 应用程序:初学者教程
  • 有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误
  • 如何理解应用 Java 多线程与并发编程?
  • Java Spring 中常用的 @PostConstruct 注解使用总结
  • 线程 vs 虚拟线程:深入理解及区别
  • 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
  • 10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!
  • “打破重复代码的魔咒:使用 Function 接口在 Java 8 中实现优雅重构!”
  • Java 中消除 If-else 技巧总结
  • 线程池的核心参数配置(仅供参考)
  • 【人工智能】聊聊Transformer,深度学习的一股清流(13)
  • Java 枚举的几个常用技巧,你可以试着用用
  • 如何理解线程安全这个概念?
  • 理解 Java 桥接方法
  • Spring 整合嵌入式 Tomcat 容器
  • Tomcat 如何加载 SpringMVC 组件

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

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

相关文章

【二刷hot100】day 4

终于有时间刷刷力扣&#xff0c;求实习中。。。。 目录 1.最大子数组和 2.合并区间 3.轮转数组 4.除自身以外数组的乘积 1.最大子数组和 class Solution {public int maxSubArray(int[] nums) {//就是说可以转换为计算左边的最大值&#xff0c;加上中间的值&#xff0c…

1.6,unity动画Animator屏蔽某个部位,动画组合

动画组合 一边跑一边攻击 using System.Collections; using System.Collections.Generic; using UnityEngine;public class One : MonoBehaviour {private Animator anim;// Start is called before the first frame updatevoid Start(){anim GetComponent<Animator>();…

PPT自动化:Python如何修改PPT文字和样式!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 使用 Python 修改 PPT 文本内容📝 遍历所有幻灯片和文本框📝 设置和修改文本样式📝 复制和保留文本样式⚓️ 相关链接 ⚓️📖 介绍 📖 在日常工作中,PPT 的文字内容和样式修改似乎是一项永无止境的…

渗透测试实战—教育攻防演练中突破网络隔离

免责声明&#xff1a;文章来源于真实渗透测试&#xff0c;已获得授权&#xff0c;且关键信息已经打码处理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本…

基准线markLine的值超过坐标轴范围导致markline不显示

解决问题&#xff1a;动态设置yAxis的max值&#xff08;解决基准线不在y轴范围&#xff09; yAxis: [{name: 单位&#xff1a;千,...yAxis,nameTextStyle:{...yAxis.nameTextStyle,padding: [0,26,0,24]},paddingLeft:24,paddingRight:26},{name: 单位&#xff1a;百分比,...yA…

基金好书入门阅读笔记《基金作战笔记:从投基新手到配置高手的进阶之路》笔记3

公募基金的分类方式按投资范围分 80%以上资产投资于股票的&#xff0c;叫股票基金&#xff1b;80%以上资产投资于债券的&#xff0c;叫债券基金&#xff1b;80% 以上资产投资于其他基金的&#xff0c;叫FOF; 80%以上资产投资于货币市场的&#xff0c;叫货币基金&#xff1b;以上…

建库建表练习

目录 根据以下需求完成图书管理系统数据库及表设计&#xff0c;并建库建表&#xff0c;并截图创建表的详细信息(desc 表名),不用添加数据 1. 用户表: 字段: 姓名&#xff0c;用户名&#xff0c;密码&#xff0c;电话&#xff0c;住址&#xff0c;专业及年级 2. 图书表: 字段: 图…

大数据新视界 -- 大数据大厂之 AI 驱动的大数据分析:智能决策的新引擎

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Flux.all 使用说明书

all public final Mono<Boolean> all(Predicate<? super T> predicate)Emit a single boolean true if all values of this sequence match the Predicate. 如果该序列中的所有值都匹配给定的谓词&#xff08;Predicate&#xff09;&#xff0c;则发出一个布尔值…

大模型之三十二-语音合成TTS(coqui) 之二 fine-tune

在 大模型之三十-语音合成TTS(coqui)[shichaog CSDN]中提到了xttsv2的fine-tune。 数据情况&#xff1a; 我是从bilibili up主小Lin说提取了一些视频&#xff0c;然后进行了重新的fine-tune。 训练结果 如下图所示&#xff0c;上面波形幅度较大的是xttsv2原始模型的结果&am…

tauri打包失败Error failed to bundle project: error running light.exe解决办法

Running light to produce D:\a\PakePlus\PakePlus\src-tauri\target\release\bundle\msi\快手_0.0.1_x64_en-US.msi Error failed to bundle project: error running light.exe ELIFECYCLE  Command failed with exit code 1. Error: Command failed with exit code 1: pnpm …

Python进阶--海龟绘图turtle库

目录 1. 画笔运动命令 2. 画笔控制命令 3. 设置画布大小 1. 画笔运动命令 2. 画笔控制命令 turtle.pensize()&#xff1a;设置画笔的宽度&#xff1b; turtle.pencolor(‘red’)&#xff1a;没有参数传入&#xff0c;返回当前画笔颜色&#xff0c;传入参数设置画笔颜色。 t…

Linux:线程及其控制

我们已经学了线程的创建&#xff0c;现在要学习线程的控制 线程等待 我们来先写一个没有线程等待的代码&#xff1a; pthcon.c: #include<stdio.h> #include<pthread.h> void* gopthread(void* arg){while(1){printf("pthread is running\n");sleep(1…

你了解的spring框架有哪些

列举一些重要的Spring模块&#xff1f; Spring Core&#xff1a; 基础,可以说 Spring 其他所有的功能都需要依赖于该类库。主要提供 IOC 依赖注入功能。**Spring Aspects ** &#xff1a; 该模块为与AspectJ的集成提供支持。Spring AOP &#xff1a;提供了面向方面的编程实现。…

【翻译】Qt Designer自定义控件简介

原文链接&#xff1a;Using Custom Widgets with Qt Widgets Designer Qt Designer 可以通过其可扩展的插件机制显示自定义控件&#xff0c;允许用户和第三方扩展定义控件的范围。或者&#xff0c;也可以使用现有的控件作为提供类似 API 的控件类的占位符。 处理自定义控件 尽…

app端文章列表查询-详细教程(上)

app端文章列表查询 一、数据库方面 有关文章的表垂直拆分成了三张表&#xff1a;文章基本信息表&#xff08;字段有文章id、文章作者、文章标题、发布时间等&#xff09;、文章配置表&#xff08;字段有文章id、文章是否可评论、文章可转发、是否已下架、是否已删除等&#x…

STM32CubeIDE(Eclipse)Post-build steps添加带参.exe实现全流程(2):带参调用.exe的几种方法

0 工具准备 STM32CubeIDE工程 带参.exe1 前言 使用STM32CubeIDE编译生成了二进制镜像文件后&#xff0c;有时为了防止镜像被恶意修改&#xff0c;可以通过添加校验和来对整个镜像进行保护&#xff0c;实现手段就是在STM32CubeIDE工程Post-build steps中调用一些外部程序来为镜…

docker配置mysql8报错 ERROR 2002 (HY000)

通过docker启动的mysql&#xff0c;发现navicat无法连接&#xff0c;后来进入容器内部也是无法连接&#xff0c;产生以下错误 root9f3b90339a14:/var/run/mysqld# mysql -u root -p Enter password: ERROR 2002 (HY000): Cant connect to local MySQL server through socket …

【C++、数据结构】二叉排序树(二叉查找树、二叉搜索树)(图解+完整代码)

目录 [⚽1.什么是二叉排序树] [&#x1f3d0;2.构建二叉排序树] [&#x1f3c0;3.二叉排序树的查找操作] [&#x1f94e;4.二叉排序树的删除] [&#x1f3b1;5.完整代码] ⚽1.什么是二叉排序树 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是…

vue3--实现瀑布流-长列表-懒加载

前言 在这一章我们主要学习&#xff1a;瀑布流、长列表、懒加载等功能 瀑布流组件 数据格式 [{"tags": ["all","home","desire","pets"],"_id": "62208123fb7e8b6da85b7dfe","photoLink":…