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

SpringBoot自定义starter

SpringBoot自定义starter

1、SpringBoot之starter机制

1.1、什么是自定义starter

​ SpringBoot中的starter是一种非常重要的机制(自动化配置),能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置。starter让我们摆脱了各种依赖库的处理,需要配置各种信息的困扰。

SpringBoot会自动通过classpath路径下的类发现需要的Bean,并注册进IOC容器。SpringBoot提供了针对日常企业应用研发各种场景的spring-boot-starter依赖模块。

缺点:

springboot starter带来的问题
starter使SpringBoot集成第三方框架变得简单,但对刚刚上手SpringBoot的人来说,可能只知道配置属性是在application.xml或application.yml中添加,但他们各自的属性都有哪些,具体怎么配置,却无从下手

1.2、为什么要使用Springboot的自定义starter

使用自定义starter有几个重要的原因:

  1. 简化依赖管理:通过将常用的依赖和配置封装到一个starter中,可以避免在每个项目中手动添加和管理这些依赖,从而减少了开发人员的工作量和错误的可能性。
  2. 提高开发效率:自定义starter能够自动加载所需的配置和组件,帮助开发团队快速搭建具备特定功能的项目骨架。这样开发者可以更专注于业务逻辑的实现,而不是花费时间在配置上。
  3. 便于维护和升级:当需要更新或升级功能时,只需修改自定义starter,所有依赖于该功能的项目都可以从更新中受益,无需逐个修改每个项目。
  4. 推广和共享:自定义starter可以被发布到公共仓库中,使其他开发团队或开发者能够轻松地引入和使用,促进了代码重用和团队之间的合作。

总结来说,使用自定义starter可以显著简化项目的开发和维护流程,提高团队的整体开发效率,同时也有助于代码的标准化和共享。

1.3、SpringBoot的自定义starter的应用场景

  1. 简化多服务公用框架集成
    • 在微服务架构中,多个服务可能会共用某些框架或功能,如Swagger用于生成在线接口文档。通过创建自定义starter,可以简化每个服务中的配置过程,避免重复劳动。例如,封装一个swagger-starter,服务中只需引入此starter即可自动生成接口文档,无需在每个服务中单独配置。
  2. 服务间调用的鉴权
    • 当服务间通过Feign进行相互调用且需要进行鉴权时,可以创建一个自定义starter来封装鉴权逻辑。这样,在每个服务发起调用之前,都会自动添加鉴权参数,目标服务收到请求后也会自动进行鉴权,从而简化了每个服务的鉴权配置。
  3. 快速搭建特定功能的项目
    • 针对特定功能或业务需求,可以创建自定义starter来快速搭建项目。例如,开发一个电商平台时,可以创建一个包含商品管理、订单处理、支付接口等功能的自定义starter。新项目只需引入此starter,即可快速具备这些功能。
  4. 统一配置和管理
    • 在大型项目中,可能存在多个服务或模块需要共享某些配置或管理功能。通过自定义starter,可以将这些共享的配置和管理功能封装起来,确保各个服务或模块能够一致地使用这些功能。
  5. 第三方库或框架的集成
    • 当需要使用某个特定的第三方库或框架时,如果Spring Boot官方没有提供相应的starter,可以自定义一个starter来简化集成过程。这样,其他项目只需引入这个自定义starter,就可以轻松地使用该第三方库或框架。

总的来说,自定义Spring Boot starter的应用场景非常广泛,主要用于简化配置、提高开发效率、统一管理和维护等方面

1.4.自动加载核心注解说明

请添加图片描述

2、创建一个自定义starter

2.1、命名规范

  • SpringBoot官方命名方式:
spring-boot-starter-{模块名}

例如:spring-boot-starter-web

  • 自定义命名方式:
{模块名}-spring-boot-starter

例如:teststarter-spring-boot-starter

starter项目和SpringBoot工程结构没有什么区别。必须引入的依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>

spring-boot-configuration-processor 是一个注解处理器,用于处理 Spring Boot 配置类的注解,并生成配置属性的元数据。它在开发过程中起到以下几个重要的作用:

  1. 生成配置属性的元数据: 当你使用 @ConfigurationProperties 注解来声明配置类时,spring-boot-configuration-processor 会解析该注解,并生成与配置属性相关的元数据。这些元数据包括属性的名称、类型、描述、默认值等信息。这些信息可以帮助 IDE 在开发过程中提供代码提示、自动补全和验证功能。
  2. 提供配置属性的编译时验证: 使用 @ConfigurationProperties 注解时,你可以使用其他注解(如 @Value@Valid 等)来描述配置属性的约束条件。spring-boot-configuration-processor 可以处理这些注解,并在编译时进行验证。这样,你可以在开发阶段及早发现配置属性的错误或不一致,而不是在运行时才遇到问题。
  3. 简化配置类的编写: 通过使用 spring-boot-configuration-processor,你可以更轻松地编写配置类。它会自动处理 @ConfigurationProperties 注解及其相关注解,生成属性的 getter、setter 方法,并提供默认的配置文件映射规则。这样,你可以专注于定义配置属性的结构和业务逻辑,而不需要手动编写重复的代码。
  4. 提升开发体验: spring-boot-configuration-processor 增强了开发工具的功能,例如在 IDE 中提供配置属性的智能提示、文档、类型检查等功能。这可以减少开发过程中的错误,并提高代码的可读性和可维护性。

总而言之,spring-boot-configuration-processor 可以简化 Spring Boot 配置类的开发,提供编译时验证和开发工具的支持,从而改善开发体验并减少潜在的配置错误。它是 Spring Boot 框架中重要的辅助工具,帮助开发者更高效地处理配置属性。

2.2、创建项目

使用Cloud Native App Initializer (aliyun.com)云原生应用脚手架创建项目(注:也可以直接使用IDEA创建)

在这里插入图片描述

使用IDEA打开项目

在这里插入图片描述

在pom.xml中引入依赖

在这里插入图片描述

2.3、创建配置类properties

/*** 属性配置类:用于接收外部传导的参数*/
@ConfigurationProperties(prefix="scloud.sms")
public class SmsProperties {private String accessKeyId;//访问ID、即帐号private String accessKeySecret;//访问凭证,即密码public String getAccessKeyId() {return accessKeyId;}public void setAccessKeyId(String accessKeyId) {this.accessKeyId = accessKeyId;}public String getAccessKeySecret() {return accessKeySecret;}public void setAccessKeySecret(String accessKeySecret) {this.accessKeySecret = accessKeySecret;}
}

2.4、编写相关接口以及相关实现类代码

接口:

package com.zking.teststarterspringbootstarter.service;public interface ItestStarter {String login(String name);
}

实现类:

package com.zking.teststarterspringbootstarter.service;import com.zking.teststarterspringbootstarter.properties.Smsproperties;public class testStarterImpl implements ItestStarter {private Smsproperties smsproperties;public testStarterImpl(Smsproperties smsproperties) {this.smsproperties = smsproperties;}public void setSmsproperties(Smsproperties smsproperties) {this.smsproperties = smsproperties;}@Overridepublic String login(String name) {if (!smsproperties.getAccessKeyId().equals("admin"))return name+"sorry,"+smsproperties.getAccessKeyId()+"用户不存在";elsereturn name+"欢迎登录,你的账号为:"+smsproperties.getAccessKeyId();}
}

2.5、创建自动配置类

@EnableConfigurationProperties注解的作用是@ConfigurationProperties注解生效。如果只配置@ConfigurationProperties注解,在IOC容器中是获取不到properties配置文件转化的bean的

package com.zking.teststarterspringbootstarter.autoconfig;import com.zking.teststarterspringbootstarter.properties.Smsproperties;
import com.zking.teststarterspringbootstarter.service.ItestStarter;
import com.zking.teststarterspringbootstarter.service.testStarterImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** 自动配置类*/
@Configuration
@EnableConfigurationProperties({Smsproperties.class})
public class AutoConfig {@Autowiredprivate Smsproperties smsproperties;/*** 通过Bean注解将其注入到spring上下文中* @return*/@Beanpublic ItestStarter testStarterService(){return new testStarterImpl(smsproperties);}
}

2.6、编写spring.factories文件加载自动配置类

首先需要在resource目录下创建一个META-INF目录如图:

在这里插入图片描述

在该文件中加入如下配置,该配置指定上步骤中定义的配置类为自动装配的配置:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.zking.scloudspringbootstarter.config.AutoConfig,\com.zking.scloudspringbootstarter.config.WebLogAutoConfig

注意:其中AutoConfig是starter配置文件的类限定名,多个之间逗号分割,还可以\进行转义即相当于去掉后面换行和空格符号。

2.7、打包安装

在这里插入图片描述

2.8、其他项目引用并测试

在这里插入图片描述

2.9、创建controller测试访问

在这里插入图片描述

3、自定义starter基于AOP切面

3.1.创建配置类Properties

enabled属性用于控制是否开关日志,请提供enabled属性的getter、setter方法。

/*** AOP日志配置类*/
@ConfigurationProperties(prefix ="scloud.weblog")
public class WebLogProperties {private boolean enabled;//TODO
}

3.2.实现基于AOP技术的日志切面功能

@Component
@Slf4j
@Aspect
public class WebLogAspect {@Pointcut("execution(public * com.zking..controller.*.*(..))")@Pointcut("execution(* *..*Controller.*(..))")public void webLog(){}@Before("webLog()")public void doBefore(JoinPoint joinPoint) throws Throwable {// 接收到请求,记录请求内容ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();// 记录下请求内容log.info("开始服务:{}", request.getRequestURL().toString());log.info("客户端IP :{}" , request.getRemoteAddr());log.info("参数值 :{}", Arrays.toString(joinPoint.getArgs()));}@AfterReturning(returning = "ret", pointcut = "webLog()")public void doAfterReturning(Object ret) throws Throwable {// 处理完请求,返回内容log.info("返回值 : {}" , ret);}
}

3.3.创建自动配置类

@Configuration
@EnableConfigurationProperties({WebLogProperties.class})
@ConditionalOnProperty(prefix = "scloud.weblog",value="enabled",matchIfMissing = true)
public class WebLogAutoConfig {@Bean@ConditionalOnMissingBeanpublic WebLogAspect webLogAspect(){return new WebLogAspect();}
}

matchIfMissing属性:默认情况下matchIfMissing为false,也就是说如果未进行属性配置,则自动配置不生效。如果matchIfMissing为true,则表示如果没有对应的属性配置,则自动配置默认生效。

配置属性enabled:

  • 不配置enabled:matchifmissing=false 不满足 matchifmissing=true 满足
  • 配置enabled=false: matchifmissing=false 不满足 matchifmissing=true 不满足
  • 配置enabled=true:matchifmissing=false 满足 matchifmissing=true 满足

3.4.编写spring.factories文件

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.zking.scloudspringbootstarter.config.AutoConfig,\com.zking.scloudspringbootstarter.config.WebLogAutoConfig

3.5.打包安装

参考《创建一个自定义starter》中的2.7、打包安装。

打包安装完成之后,直接在其他项目引入依赖并配置测试即可。

尾言

自动装配流程如何实现:

首先在启动类中存在@SpringBootApplication(启动类注解)注解,在这个注解中存在@EnableAutoConfiguration(启动自动专装配注解)通过他内部的@import注解会导入批量导入bean并进行bean的注册,它会运行内部的selectImports方法,在方法中调用getCandidateConfigurations方法,查询对应的需要自动装配的装配类,在这个方法中调用了SpringFactoriesLoader类(它对查找的文件进行了一个约束只能是:“META-INF/spring.fatories”)中的loadFactoryNames方法,返回需要进行装配的类;SpringBoot会根据spring.fatories文件中org.springframework.boot.autoconfigure.EnableAutoConfiguration这个key找到对应的自定义配置类进行自动装配!

相关文章:

SpringBoot自定义starter

SpringBoot自定义starter 1、SpringBoot之starter机制 1.1、什么是自定义starter ​ SpringBoot中的starter是一种非常重要的机制(自动化配置)&#xff0c;能够抛弃以前繁杂的配置&#xff0c;将其统一集成进starter&#xff0c;应用者只需要在maven中引入starter依赖&#…...

深入探索大语言模型

深入探索大语言模型 引言 大语言模型&#xff08;LLM&#xff09;是现代人工智能领域中最为重要的突破之一。这些模型在自然语言处理&#xff08;NLP&#xff09;任务中展示了惊人的能力&#xff0c;从文本生成到问答系统&#xff0c;无所不包。本文将从多个角度全面介绍大语…...

querylist多线程采集curlMulti时,报错Curl error(60)

前言 在使用querylist多线程采集的时候&#xff0c;报错: Curl error(60)。测试了下用http时没有问题&#xff0c;https时有问题。其原因在于多线程采集库引用的另一个库有问题。需要手动更改。 解决 找到&#xff1a;vendor/ares333/php-curl/src/Curl.php 文件&#xff0c…...

Python数据分析~~美食排行榜

目录 1.模块的导入和路径的选择 2.访问前面五行数据 3.按照条件进行筛选 4.获取店铺评分里面的最高分 5.打印对应的店铺的名字 1.模块的导入和路径的选择 # 导入pandas模块&#xff0c;简称为pd import pandas as pd # 使用read_csv()函数 # TODO 读取路径"/Users/fe…...

Linux下解压.tar.gz文件

.tar.gz 是一种常用的压缩包格式&#xff0c;尤其在Unix、Linux以及macOS系统中非常普遍。这个格式结合了两种不同的功能&#xff1a; Tar (.tar): “Tar” 是“Tape Archive”的缩写&#xff0c;最初是为了将数据备份到磁带上而设计的。Tar命令可以将多个文件和目录打包成一个…...

【电商选品干货】差异化卖点要这样打造,80%商家却做不到

今天就给大家说说&#xff0c;如何去挖掘产品的差异化卖点&#xff1f;我们要找差异化卖点&#xff0c;就是因为我们的产品转化率不足&#xff0c;通常有下面几点原因&#xff1a; 1、产品差异化卖点不足&#xff0c;商家占比30% 2、流量和产品卖点不匹配&#xff0c;商家占比…...

LabVIEW比例压力控制阀自动测试系统

开发了一套基于LabVIEW编程和PLC控制的比例控制阀自动测试系统。该系统能够实现共轨管稳定的超高压供给&#xff0c;自动完成比例压力控制阀的耐久测试、流量滞环测试及压力-流量测试。该系统操作简便&#xff0c;具有高精度和高可靠性&#xff0c;完全满足企业对自动化测试的需…...

运营商认证API在Java、Python、PHP中的使用教程

随着数字化浪潮的推进&#xff0c;实名认证已深入我们生活的方方面面&#xff0c;从线上购物到电子资金转移&#xff0c;手机号已成为注册账号的主要凭证。然而&#xff0c;这也带来了身份验证的难题和手机号被盗用注册账号的风险。在信息爆炸的时代背景下&#xff0c;确保每个…...

用虚拟机,可以在x86的电脑上虚拟出arm的电脑吗

1.用虚拟机&#xff0c;可以在x86的电脑上虚拟出arm的电脑吗 是的&#xff0c;可以在x86的电脑上使用虚拟机技术虚拟出ARM架构的电脑。以下是通过虚拟机实现x86电脑上虚拟ARM电脑的几个关键步骤&#xff1a; 选择合适的虚拟化软件&#xff1a;通常&#xff0c;你可以使用如QE…...

富格林:可信观念摆脱暗箱陷阱

富格林指出&#xff0c;投资者产生的暗箱亏损多半是由于被不可信观念的迷惑影响&#xff0c;以为真的可以毫不费力就能赚钱&#xff0c;最后发现连交易的本金都打水漂了。事实上&#xff0c;投资市场并不像大家想得那么简单。要想安全实现交易成功&#xff0c;避免暗箱陷阱&…...

WEB前端01-HTML5基础(01)

一.WEB相关概念 软件架构 C/S: Client/Server &#xff08;客户端/服务器端&#xff09;&#xff1a;在用户本地有一个客户端程序&#xff0c;在远程有一个服务器端程序 优点&#xff1a;用户体验好 缺点&#xff1a;开发、安装&#xff0c;部署&#xff0c;维护麻烦 B/S: Br…...

JUC-常见方法与线程的状态

常见方法 start()与run() 主线程直接调用某个线程t1的run()方法&#xff0c;run方法也会执行&#xff0c;但是并不会启动新的线程&#xff0c;而是有主线程调用的run方法&#xff0c;必须使用start才能启动新线程&#xff0c;但是start只能调用一次。 sleep()与yield() sle…...

如果你酿的酒是黄色,说明肯定是 “糊锅”了。

刚刚酿出的酒一般都是清澈见底的&#xff0c;如果你酿的酒是黄色&#xff0c;说明肯定是 “糊锅”了。这样的酒不仅颜色是黄的&#xff0c;而且还能闻到一股特别浓厚的 焦糊味。 这样的酒&#xff0c;米酒小哥是非常非常熟悉的&#xff0c;因为刚开始学习酿酒的那段时 间&#…...

国漫推荐07

玄幻、奇幻 1.侠岚系列 《侠岚》&#xff08;第1至6季&#xff09; 《画江湖之侠岚》&#xff08;侠岚第7季&#xff09; 2.《斗破苍穹》 三十年河东&#xff0c;三十年河西&#xff0c;莫欺少年穷&#xff01; 3.《武动乾坤》&#xff08;第1至4季&#xff09; 4.《妖神记》…...

力扣刷题35.搜索查找位置

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例 2: 输入:…...

setContentView 流程

setContentView 流程 Activity -> setContentView 开发者设置入口PhoneWindow -> setContentView mWindow 在 attach 时初始化为 PhoneWindow&#xff0c;同时PhoneWindow也是Window唯一的实现类PhoneWindow -> installDecor 这一步的作用是 初始化DecorView, 把Deco…...

基于STM32设计的智能手环(ESP8266+华为云IOT)178

基于STM32设计的智能手环(178) 文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】项目硬件模块组成【3】ESP8266工作模式配置【4】Android手机APP开发思路【5】项目模块划分1.2 项目功能需求(1)生理参数监测(2)计步功能(3)GPS定位(4)时间显示(5)OLED显示屏展示(…...

EE trade:实物黄金投资的好处和坏处

实物黄金是指以金条、金币、金饰品等形式存在的黄金。实物黄金具有保值、避险、抗通胀等特性&#xff0c;被视为传统的投资避险工具。近年来&#xff0c;随着全球经济形势的不确定性增加&#xff0c;实物黄金的投资价值也受到越来越多的关注。 投资实物黄金的优势 保值性&…...

Flutter RSA公钥转PEM

需添加依赖&#xff1a;pointycastle​​​​​​​ 参考链接&#xff1a;https://github.com/bcgit/pc-dart/issues/165 import dart:convert; import dart:typed_data;import package:pointycastle/pointycastle.dart; import package:pointycastle/src/platform_check/pl…...

下载站怎么防护DDOS攻击

下载站怎么防护DDOS攻击&#xff1f;随着互联网的发展&#xff0c;下载站作为资源分享的重要平台&#xff0c;面临着日益严峻的DDoS&#xff08;分布式拒绝服务&#xff09;攻击威胁。DDoS攻击通过大量恶意请求占用网络资源&#xff0c;导致服务器响应缓慢甚至瘫痪&#xff0c;…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...