当前位置: 首页 > article >正文

Spring Boot 自定义 Starter 组件的技术指南

1、简述

Spring Boot 通过 Starter 机制,让开发者可以快速集成第三方组件。在企业级开发中,我们常常需要封装自己的 Starter 组件,以提高代码复用性,简化配置,并实现可插拔的模块化开发。

  • Spring Boot Starter 机制

  • 如何创建一个自定义 Starter

  • 如何实现 Starter 组件的热拔插

  • 完整示例:自定义日志组件并支持热拔插

2、Spring Boot Starter 机制

Spring Boot Starter 是一组依赖和自动配置的集合,提供了一种约定优于配置的方式来集成第三方库。例如:

  • spring-boot-starter-web(Web 开发)

  • spring-boot-starter-data-jpa(JPA 数据库访问)

  • spring-boot-starter-actuator(监控)

自定义 Starter 允许我们封装业务逻辑,使其像官方 Starter 一样易于使用。

3、创建自定义 Starter

我们以 日志记录组件 为例,开发一个 Starter,包含:

  • 自动配置类

  • 日志服务类

  • Spring Boot 配置绑定

  • SpringFactories 机制

实现自定义Starter要引用autoconfigure的Maven:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId><version>2.1.8.RELEASE</version>
</dependency>

3.1 编写日志服务类

LogService 提供日志打印功能,支持自定义日志前缀。

package com.example.logstarter.service;public class LogService {private String logPrefix;public LogService(String logPrefix) {this.logPrefix = logPrefix;}public void log(String message) {System.out.println(logPrefix + " " + message);}
}

3.2 编写自动配置类

package com.example.logstarter.config;import com.example.logstarter.service.LogService;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@ConditionalOnProperty(prefix = "custom.log", name = "enabled", havingValue = "true", matchIfMissing = true)
public class LogAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic LogService logService() {return new LogService("[Default Log]");}
}
  • @Configuration:声明配置类。

  • @ConditionalOnProperty:控制组件是否启用(默认启用)。

  • @ConditionalOnMissingBean:防止已有 LogService 时重复注册。

3.3 配置 spring.factories

resources/META-INF/spring.factories 中添加:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.logstarter.config.LogAutoConfiguration

Spring Boot 在启动时会自动加载 LogAutoConfiguration

3.4 在主应用引入 Starter

在 Spring Boot 主项目 的 pom.xml 添加:

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

然后在 application.yml 中启用:

custom:log:enabled: true

3.5 测试 Starter

在主应用中使用:

import com.example.logstarter.service.LogService;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;@Component
public class LogTestRunner implements CommandLineRunner {private final LogService logService;public LogTestRunner(LogService logService) {this.logService = logService;}@Overridepublic void run(String... args) throws Exception {logService.log("Spring Boot 自定义 Starter 成功!");}
}

运行后输出:

[Default Log] Spring Boot 自定义 Starter 成功!

4、实现 Starter 的热拔插

在 Spring Boot 中,热拔插(Hot Plugging) 允许我们在不重启应用的情况下动态启用或禁用某些功能。

  • 如何使用 @ConditionalOnClass 实现 Starter 组件的热拔插

  • 与 @ConditionalOnProperty 的区别

完整示例:基于 @ConditionalOnClass 的日志组件

4.1 新增标记类

@ConditionalOnClass 用于检测某个类是否存在,如果存在,则加载相应的 Bean。例如:

@ConditionalOnClass(name = “com.example.ConfigMarker”)
只有 com.example.ConfigMarker 存在时,Spring Boot 才会加载该 Bean。

热拔插思路:

  • 当 某个类 存在时,自动加载相关组件。

  • 当 该类被删除 或 未引入依赖 时,不加载该组件,达到动态启用/禁用的目的。

通过自定义注解@EnableRegisterServer开关来控制热拔插技术:

import org.springframework.context.annotation.Import;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Import({ConfigMarker.class})
public @interface  EnableRegisterServer {
}

4.2 启动注解

在启动类Application添加@EnableRegisterServer这样就可以启动LogService类实例:

@EnableRegisterServer
@SpringBootApplication
public class CsvApplication {public static void main(String[] args) {SpringApplication.run(CsvApplication.class, args);}
}

相关文章:

Spring Boot 自定义 Starter 组件的技术指南

1、简述 Spring Boot 通过 Starter 机制&#xff0c;让开发者可以快速集成第三方组件。在企业级开发中&#xff0c;我们常常需要封装自己的 Starter 组件&#xff0c;以提高代码复用性&#xff0c;简化配置&#xff0c;并实现可插拔的模块化开发。 Spring Boot Starter 机制 …...

计算机二级WPS Office第九套WPS演示

解题过程...

计算机网络-2 物理层

【考纲内容】 &#xff08;一&#xff09;通信基础 信道、信号、带宽、码元、波特、速率、信源与信宿等基本概念&#xff1b; 奈奎斯特定理与香农定理&#xff1b;编码与调制&#xff1b; 电路交换、报文交换与分组交换&#xff1b;数据报与虚电路① 视频讲解 &#xff08;二…...

三分钟掌握音频提取 | 在 Rust 中优雅地处理视频音频

前言 在多媒体开发中&#xff0c;从视频中提取音频是一个常见需求。比如&#xff0c;你可能需要分离背景音乐来单独欣赏&#xff0c;或者提取对白用于语音分析&#xff0c;甚至为视频生成字幕。无论目的如何&#xff0c;音频提取都是多媒体处理中的基础操作。 传统上&#xf…...

Redis集群哨兵相关面试题

目录 1.Redis 主从复制的实现原理是什么? 详解 补充增量同步 replication buffer repl backlog buffer 2.Redis 主从复制的常见拓扑结构有哪些? 3.Redis 复制延迟的常见原因有哪些? 4.Redis 的哨兵机制是什么? 主观下线和客观下线 哨兵leader如何选出来的&#x…...

Shopify Checkout UI Extensions

结账界面的UI扩展允许应用开发者构建自定义功能&#xff0c;商家可以在结账流程的定义点安装&#xff0c;包括产品信息、运输、支付、订单摘要和Shop Pay。 Shopify官方在去年2024年使用结账扩展取代了checkout.liquid&#xff0c;并将于2025年8月28日彻底停用checkout.liquid…...

Perl 环境安装指南

Perl 环境安装指南 引言 Perl是一种广泛使用的解释型、动态编程语言,以其强大的文本处理能力和灵活性著称。本文将为您详细介绍Perl环境的安装过程,包括系统要求、安装步骤以及注意事项。 系统要求 在安装Perl之前,请确保您的计算机满足以下基本要求: 操作系统:Window…...

MOSN(Modular Open Smart Network)-04-TLS 安全链路

前言 大家好&#xff0c;我是老马。 sofastack 其实出来很久了&#xff0c;第一次应该是在 2022 年左右开始关注&#xff0c;但是一直没有深入研究。 最近想学习一下 SOFA 对于生态的设计和思考。 sofaboot 系列 SOFAStack-00-sofa 技术栈概览 MOSN&#xff08;Modular O…...

Softmax 回归 + 损失函数 + 图片分类数据集

Softmax 回归 softmax 回归是机器学习另外一个非常经典且重要的模型&#xff0c;是一个分类问题。 下面先解释一下分类和回归的区别&#xff1a; 简单来说&#xff0c;分类问题从回归的单输出变成了多输出&#xff0c;输出的个数等于类别的个数。 实际上&#xff0c;对于分…...

重温Ubuntu 24.04 LTS

用户调整 # 创建新用户 sudo adduser newusername # 设置新用户的密码 sudo passwd newusername # 将新用户添加到 sudo 组 sudo usermod -aG sudo newusername # 修改ssh访问权限 sudo nano /etc/ssh/sshd_config # 将新用户加入&#xff0c;此时root将无法访问 AllowUsers n…...

FreeRTOS学习(十):任务调度器挂起与恢复机制详解

FreeRTOS学习&#xff08;十&#xff09;&#xff1a;任务调度器挂起与恢复机制详解 文章目录 FreeRTOS学习&#xff08;十&#xff09;&#xff1a;任务调度器挂起与恢复机制详解简介一、 任务挂起与恢复的API函数1.1 任务挂起函数1.2 任务恢复函数 二、重要特性与临界区的区别…...

【C++】内存模型分析

在 C 语言中&#xff0c;程序运行时的内存通常被划分为以下几个区域&#xff1a; 代码区&#xff08;Text Segment&#xff09;常量区&#xff08;Constant Segment&#xff09;全局/静态区&#xff08;Data Segment&#xff0c;包含静态数据段和 BSS 段&#xff09;堆区&…...

Vue2+OpenLayers携带请求头加载第三方瓦片数据

目录 一、案例截图 二、安装OpenLayers库 三、代码实现 一、案例截图 在对接一些第三方GIS地图的时候,需要携带请求头来验证身份,从而获取相应的瓦片数据,这时候我们需要改造一下WMTS服务的调用方式,效果如图所示: 二、安装OpenLayers库 npm install ol 三、代码实现…...

智能汽车图像及视频处理方案,支持视频实时拍摄特效能力

在智能汽车日新月异的今天&#xff0c;美摄科技作为智能汽车图像及视频处理领域的先行者&#xff0c;凭借其卓越的技术实力和前瞻性的设计理念&#xff0c;为全球智能汽车制造商带来了一场视觉盛宴的革新。美摄科技推出智能汽车图像及视频处理方案&#xff0c;一个集高效性、智…...

Vue 中如何使用 v-model 实现自定义组件的双向绑定?

在 Vue 中,使用 v-model 实现自定义组件的双向绑定需要遵循一套特定的规则。以下是关于如何实现这一功能的详细步骤和示例。 1. 理解 v-model 在 Vue 中,v-model 实际上是语法糖,它在内部实现了 :value 和 @input 的结合。使用 v-model 的自定义组件需要支持以下两个属性:…...

数据结构--顺序表(实现增删改查)

三个文件&#xff08;Mytest.c 、MySeqList.c 、 MySeqList.h&#xff09; Mytest.c测试函数 MySeqList.c 函数定义 MySeqList.h函数声明 增删改查的步骤&#xff1a; 初始化 增加元素 • 尾插&#xff1a;先检查顺序表空间是否足够&#xff0c;若不足则进行扩容&#x…...

【android】补充

3.3 常用布局 本节介绍常见的几种布局用法&#xff0c;包括在某个方向上顺序排列的线性布局&#xff0c;参照其他视图的位置相对排列的相对布局&#xff0c;像表格那样分行分列显示的网格布局&#xff0c;以及支持通过滑动操作拉出更多内容的滚动视图。 3.3.1 线性布局Linea…...

HTML 表单处理进阶:验证与提交机制的学习心得与进度(一)

引言 在前端开发的广袤领域中&#xff0c;HTML 表单处理堪称基石般的存在&#xff0c;是构建交互性 Web 应用不可或缺的关键环节。从日常频繁使用的登录注册表单&#xff0c;到功能多样的搜索栏、反馈表单&#xff0c;HTML 表单如同桥梁&#xff0c;紧密连接着用户与 Web 应用…...

23.linux下电脑健康检查

电脑健康检查 硬盘 工具 sudo apt-get install smartmontools检查命令 sudo smartctl -a /dev/sdb1输出结果 # smartctl 7.2 2020-12-30 r5155 [x86_64-linux-6.8.0-52-generic] (local build) # Copyright (C) 2002-20, Bruce Allen, Christian Franke, www.smartmontools…...

数据库自然连接详解

各类资料学习下载合集 ​​https://pan.quark.cn/s/8c91ccb5a474​​ 数据库自然连接详解 自然连接&#xff08;Natural Join&#xff09;是一种在关系型数据库中用于合并两个或多个表的数据的操作。它基于表之间的公共列&#xff0c;自动识别具有相同列名的列&#xff0c;并…...

说说MyBatis一、二级缓存和Spring一二级缓存有什么关系?

大家好&#xff0c;我是锋哥。今天分享关于【说说MyBatis一、二级缓存和Spring一二级缓存有什么关系&#xff1f;】面试题。希望对大家有帮助&#xff1b; 说说MyBatis一、二级缓存和Spring一二级缓存有什么关系&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源…...

蓝桥杯题型分布2

蓝桥杯 蓝桥杯题型分类2素数孪生素数素数个数朴素筛法求素数线性筛法求素数 因数分解试除法分解质因数 等差素数列梅森素数组素数素数环找素数(分段筛&#xff09;连续素数和小明的素数对疑似素数质数拆分纯质数超级质数质数日期质数游戏2魔法阵的能量阿坤老师切割年糕阶乘分解…...

北京交通大学第三届C语言积分赛

作者有言在先&#xff1a; 题解的作用是交流思路&#xff0c;不是抄作业的。可以把重点放在思路分析上而不是代码上&#xff0c;毕竟每个人的代码风格是不一样的&#xff0c;看别人的代码就跟做程序填空题一样。先看明白思路再看代码。 还有就是&#xff0c;deepseek真的很好用…...

ESP32学习 -从STM32工程架构进阶到ESP32架构

ESP32与STM32项目文件结构对比解析 以下是对你提供的ESP32项目文件结构的详细解释&#xff0c;并与STM32&#xff08;以STM32CubeIDE为例&#xff09;的常见结构进行对比&#xff0c;帮助你理解两者的差异&#xff1a; 1. ESP32项目文件解析 文件/目录作用STM32对应或差异set…...

vue响应式原理剖析

一、什么是响应式? 我们先来看一下响应式意味着什么?我们来看一段代码: m有一个初始化的值,有一段代码使用了这个值; 那么在m有一个新的值时,这段代码可以自动重新执行; let m = 20 console.log(m) console.log(m * 2)m = 40上面的这样一种可以自动响应数据变量的代码机…...

【HTML 基础教程】HTML 元素

HTML 文档由 HTML 元素定义。 HTML 元素 开始标签 *元素内容结束标签 *<p>这是一个段落</p><a href"default.htm">这是一个链接</a><br>换行 *开始标签常被称为起始标签&#xff08;opening tag&#xff09;&#xff0c;结束标签常称…...

解锁智能制造新体验:兰亭妙微 UE/UI 设计赋能行业变革

在智能制造时代的滚滚浪潮中&#xff0c;企业的数字化转型不仅是技术的革新&#xff0c;更是用户体验与交互界面的全面升级。然而&#xff0c;许多制造企业在这一转型过程中&#xff0c;面临着一系列 UI/UE 设计难题&#xff0c;严重阻碍了企业的数字化发展进程。兰亭妙微凭借专…...

Element UI实现表格全选、半选

制作如图所示的表格全选、半选&#xff1a; 父组件 <template><div id"app"><SelectHost :hostArray"hostArray" /></div> </template><script> import SelectHost from ./components/SelectHost.vue export default…...

如何使用动作捕捉系统训练人形机器人

随着人形机器人变得越来越先进&#xff0c;使用动作捕捉系统教会它们如何像人类一样移动成为了人形机器人领域正在研究的全新方向。本文探讨了如何使用Xsens技术捕捉精确的人类运动数据&#xff0c;使机器人能够通过人工智能和机器学习安全高效地学习、适应和执行复杂任务。 近…...

Vue.js 和 Vue 3 全面详解指南

1. Vue.js 基础介绍 1.1 什么是 Vue.js Vue.js(简称 Vue)是一个用于构建用户界面的渐进式 JavaScript 框架。与其他框架不同,Vue 被设计为可以逐步采用。Vue 的核心库只关注视图层,易于上手,便于与其他库或既有项目整合。 Vue 由尤雨溪(Evan You)在 2014 年创建。尤雨…...