【SpringBoot】Starter的使用与案例讲解

🎉🎉欢迎来到我的CSDN主页!🎉🎉

🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚

🌟推荐给大家我的专栏《SpringBoot》。🎯🎯

👉点击这里,就可以查看我的主页啦!👇👇

Java方文山的个人主页

🎁如果感觉还不错的话请给我点赞吧!🎁🎁

💖期待你的加入,一起学习,一起进步!💖💖

请添加图片描述

一、Starter的简介

1.什么是SpringBoot Starter

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

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

所有这些依赖模块都遵循着约定成俗的默认配置,并允许我们调整这些配置,即遵循“约定大于配置”的理念。

2.怎么使用SpringBoot Starter

在我们的日常开发工作中,经常会有一些独立于业务之外的配置模块,我们经常将其放到一个特定的包下,然后如果另一个工程需要复用这块功能的时候,需要将代码硬拷贝到另一个工程,重新集成一遍,麻烦至极。如果我们将这些可独立于业务代码之外的功能配置模块封装成一个个starter,复用的时候只需要将其在pom中引用依赖即可, SpringBoot为我们完成自动装配,简直不要太爽。

3.应用场景

在我们的日常开发工作中,可能会需要开发一个通用模块,以供其它工程复用。SpringBoot就为我们提供这样的功能机制,我们可以把我们的通用模块封装成一个个starter,这样其它工程复用的时候只需要在pom中引用依赖即可,由SpringBoot为我们完成自动装配。

常见应用场景如下:

1)通用模块-短信发送模块

2)基于AOP技术实现日志切面

3)分布式雪花ID,Long转String,解决精度问题

4)微服务项目的数据库连接池配置

5)微服务项目的每个模块都要访问redis数据库,每个模块都要配置redisTemplate

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

二、案例讲解 

下面我用案例的方式教会大家如何使用starter启动器。

1.短信发送模块

1.1.搭建SpringBoot环境

首先我们搭建一个SpringBoot项目,需要注意的是以下图片内容,有关后期导入依赖

 导入一个注解处理器,用于处理 Spring Boot 配置类的注解,并生成配置属性的元数据。

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

开发过程中起到以下几个重要的作用:

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

在这之前需要知道以下我们启动器与springboot官方提供的依赖有什么关系

  • SpringBoot官方命名方式:

spring-boot-starter-{模块名}

例如:spring-boot-starter-web

  • 自定义命名方式:

{模块名}-spring-boot-starter

例如:mystarter-spring-boot-starter

1.2.创建配置类Properties

/*** 短信服务配置类*/
@Data
@ConfigurationProperties(prefix = "sms")
public class SmsProperties {private String key;//访问ID、即帐号private String secret;//访问凭证,即密钥private String enabled;//用于操作是否启用该模块}

提供该配置类的set\get方法并且将配置文件中以sms为前缀的属性值绑定到该类对应的属性上。

1.3.编写短信业务功能

ISmsService代码

public interface ISmsService {/*** 发送短信** @param phone        要发送的手机号* @param data         要发送的内容*/void send(String phone, String data);}

SmsServiceImpl代码

public class SmsServiceImpl implements ISmsService {private SmsProperties smsProperties ;public SmsServiceImpl(SmsProperties smsProperties) {this.smsProperties=smsProperties;}@Overridepublic void send(String phone, String data) {String key = smsProperties.getKey();String secret = smsProperties.getSecret();System.out.println("接入短信系统,Key=" + key + ",Secret=" + secret);System.out.println("短信发送,phone=" + phone + "data=" + data);}}

1.4.创建自动配置类

@Configuration
@EnableConfigurationProperties({SmsProperties.class})
@ConditionalOnProperty(prefix = "sms",name = "enable",havingValue = "true")
public class SmsConfig {@Autowiredprivate SmsProperties smsProperties;//通过@Bean注解将其注入到Spring上下文中@Beanpublic ISmsService smsService(){//调用SMS短信服务接口时,必须通过账号和密码的方式进行调用。return new SmsServiceImpl(smsProperties);}
}

该类的作用是将这个类交与spring管理的同时也把SmsProperties这个类交给spring管理,并且将这个配置类放入spring容器让其他类可以获取到,这里还有个条件就是如果我sms.enable的值不为true,那么就都不会加入到spring中。

注释小课堂:

@Configuration注解:用于定义该类是一个配置类,相当于传统Spring XML配置文件中的<beans>标签,表示其中包含有一个或多个@Bean注解的方法,用于构建bean对象并放入Spring容器中管理。

@EnableConfigurationProperties({SmsProperties.class})注解:用于启用指定类型的配置属性(Configuration Properties)。在这里,它启用了SmsProperties类作为配置属性类,使得可以在SmsConfig类中通过@Autowired注解自动注入SmsProperties对象。

@Bean注解:用于定义一个bean,并将其注入到Spring上下文中。在这个例子中,smsService方法返回的SmsServiceImpl对象会被纳入到Spring容器的管理范围内。

@ConditionalOnProperty(prefix = "sms", name = "enable", havingValue = "true")注解的作用是根据配置文件中的属性值来条件性地加载或禁用Bean。

具体而言,它基于以下三个条件进行判断:

prefix:指定属性的前缀,即在配置文件中以什么前缀开始的属性。
name:指定属性的名称,即需要判断的属性的具体名称。
havingValue:指定属性的期望值,当该属性的值与havingValue指定的值相等时,才满足条件。

1.5.测试代码

我们在application.properties配置一下SmsProperties

sms:sms.key=j7fj8eoji92dsms.secret=8u8u8u

 在测试类调用一下SmsServiceImpl的send方法

@SpringBootTest
class SmsApplicationTests {@Autowiredprivate SmsProperties smsProperties ;@Testvoid contextLoads() {new SmsServiceImpl(smsProperties).send("110", "爱你");}}

控制台输出结果

 因为我们的自动装配类,启动的spring就会将本身以及配置类注入到spring中,而配置类又与配置文件也就是application.properties做了匹配,只要配置文件中填了sms.key和sms.secret就会将填写的内容注入到配置类中。

1.6.其他模块导入短信模块

①首先需要编写spring.factories文件加载自动配置类

在resources下新建META-INF文件夹,然后创建spring.factories文件;

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.csdn.sms.Properties.SmsConfig

②打包安装

直接install即可

在本地仓库就会有你刚刚所打包的依赖

注意:打包的时候请注释application.properties,否则这里的配置就定死了,不会随着我们调用者的配置而改动!!!

③引用并测试

引入依赖

    <dependency><groupId>com.csdn</groupId><artifactId>sms</artifactId><version>0.0.1-SNAPSHOT</version></dependency>

配置application.yml

如果enable不为true,那么就不会注入javabean就会报错

测试模块功能

@SpringBootTest
class BootApplicationTests {@Autowiredprivate SmsProperties smsProperties;@Testvoid contextLoads() {new SmsServiceImpl(smsProperties).send("15574117565","其他模块");}}

看到这里我们的starter的短信模块就完成了

2.基于AOP技术的Log日志模块

我现有一个基于AOP的Log日志功能,这个切面定义了一个切入点webLog(),它匹配所有以Controller结尾的类的所有方法。在这些方法执行之前和之后,分别执行了doBefore()doAfterReturning()方法,这两个方法中包含了对请求信息的记录和处理。

@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);}
}

我现在要用刚刚的短信发送模块中的方式,通过yml配置enable的属性来控制是否开启日志模块


2.1.创建配置类Properties

@Data
@ConfigurationProperties(prefix = "weblog")
public class WebLogProperties {private String enable;//控制是否开启切面}

2.2.编写自动配置类

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

或者直接在切面类上加上注解

@ConditionalOnProperty(prefix = "weblog", value="enable",havingValue = "true")

当我们配置weblog.enable等于true的时候才会开启Log日志管理,下面演示一下

请添加图片描述

到这里我的分享就结束了,欢迎到评论区探讨交流!!

💖如果觉得有用的话还请点个赞吧 💖

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

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

相关文章

JVM调优:参数(学习笔记)

一、jvm的运行参数 标准参数 -help、-version、-D参数 jvm的标准参数&#xff0c;一般都是很稳定的&#xff0c;在未来的JVM版本中不会改变&#xff0c;可以使用java -help 检索出所有的标准参数。 通过以下命令查看&#xff1a; 命令&#xff1a;java -help 可以看到我们经常…

vue2项目vue-qrcode-reader 扫一扫二维码插件

vue2项目 vue-qrcode-reader 扫一扫二维码插件 问题所在解决办法成功展示 问题所在 今天在引导师弟做扫二维码功能&#xff0c;发现通过npm install --save vue-qrcode-reade安装死活就是报错TypeError: Object...) is not a function 解决办法 百度了很多大牛的博客&#…

uniCloud(一) 新建项目、初始化服务空间、云对象访问测试

一、新建一个带有unicloud 二、创建一个服务空间 1. 右键uniCloud&#xff0c;关联云服务空间 我当前没有服务空间&#xff0c;需要新建一个服务空间&#xff0c;之后将其关联。初始化服务空间需要的时间有点长 服务空间初始化成功后&#xff0c;刷新HBuilder&#xff0c;勾选…

0012Java安卓程序设计-ssm记账app

文章目录 **摘要**目 录系统设计5.1 APP端&#xff08;用户功能&#xff09;5.2后端管理员功能模块开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;776871563 摘要 网络的广泛应用给生活带来了十分的便利。所以把记账管理与现在网络相…

CanEasy多场景应用,让汽车总线测试更简单

来源&#xff1a;虹科汽车电子 虹科分享 | CanEasy多场景应用&#xff0c;让汽车总线测试更简单 原文链接&#xff1a;https://mp.weixin.qq.com/s/ojic4xfVTLbxXcKlJMGQZw 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 导读 CanEasy是一个基于Windows的总线工具&…

ChatGPT对话为什么不用WebSocket而使用EventSource?

文章目录 1. 引言2. WebSocket和EventSource简介2.1 WebSocket2.2 EventSource 3. ChatGPT对话系统的特点4. EventSource的优势4.1 简单易用4.2 容错性强4.3 兼容性良好 5. 为何选择EventSource而非WebSocket&#xff1f;5.1 单向通信模式5.2 长轮询模式5.3 简化部署和维护 6. …

二叉搜索树的简单理解

1. 二叉搜索树 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值 它…

监听器中GUI的理解

文章目录 前言一、Panel窗口关闭Demo总结 前言 比如登录拦截&#xff1a;用户登录后&#xff0c;会被拦截掉。就可以用监听器来处理。 一、Panel窗口关闭Demo 先创建一个窗口&#xff0c;发现点击关闭后&#xff0c;关闭不掉&#xff0c;就要添加监听事件&#xff1a; pub…

The method show() from the type Window is deprecated

java.awt.Window.show() java.awt.Component.setVisible(true); Window.show() java.awt.JFrame java.awt.Frame java.awt.Windows java.awt.Component.setVisible(true);

亿赛通电子文档安全管理系统 SQL注入漏洞复现

0x01 产品简介 亿赛通电子文档安全管理系统&#xff08;简称&#xff1a;CDG&#xff09;是一款电子文档安全加密软件&#xff0c;该系统利用驱动层透明加密技术&#xff0c;通过对电子文档的加密保护&#xff0c;防止内部员工泄密和外部人员非法窃取企业核心重要数据资产&…

Elasticsearch:为现代搜索工作流程和生成式人工智能应用程序铺平道路

作者&#xff1a;Matt Riley Elastic 的创新投资支持开放的生态系统和更简单的开发者体验。 在本博客中&#xff0c;我们希望分享 Elastic 为简化你构建 AI 应用程序的体验而进行的投资。 我们知道&#xff0c;开发人员必须在当今快速发展的人工智能环境中保持灵活性。 然而&a…

联邦蒸馏中的分布式知识一致性 | TIST 2024

联邦蒸馏中的分布式知识一致性 | TIST 2024 联邦学习是一种隐私保护的分布式机器学习范式&#xff0c;服务器可以在不汇集客户端私有数据的前提下联合训练机器学习模型。通信约束和系统异构是联邦学习面临的两大严峻挑战。为同时解决上述两个问题&#xff0c;联邦蒸馏技术被提…

激活Windows过程及报错解决: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上, 运行“ slui.exe 0x2a 0x803f7001 “以显示错误文本

激活Windows过程及报错问题解决: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上&#xff0c;运行“ slui.exe 0x2a 0x803f7001 “以显示错误文本。 前言 最近在激活Windows过程中&#xff0c;遇到了报错: 0x803f7001 在运行Microsoft Windows 非核心版本的计算机上…

人工智能|深度学习——知识蒸馏

一、引言 1.1 深度学习的优点 特征学习代替特征工程&#xff1a;深度学习通过从数据中自己学习出有效的特征表示&#xff0c;代替以往机器学习中繁琐的人工特征工程过程&#xff0c;举例来说&#xff0c;对于图片的猫狗识别问题&#xff0c;机器学习需要人工的设计、提取出猫的…

Axure的使用

1.Axure是什么&#xff1f;&#xff1f;&#xff1f; Axure是一款功能强大的原型设计工具&#xff0c;它可以让用户快速地创建交互式原型&#xff0c;并针对原型进行测试和改进。Axure的主要特点包括可定制的界面元素库、交互动画效果、条件逻辑、团队协作等功能&#xff0c;适…

LabVIEW开发远程结构健康监测系统

LabVIEW开发远程结构健康监测系统 工程师依赖于振动监测来评估建筑物、桥梁和其他大型结构的完整性。传统的振动监测工具在数据收集上存在限制&#xff0c;无法长时间收集高保真波形。随着内存存储、处理器速度和宽带无线通信技术的进步&#xff0c;出现了对能够长时间收集并实…

Spark与PySpark(1.概述、框架、模块)

目录 1.Spark 概念 2. Hadoop和Spark的对比 3. Spark特点 3.1 运行速度快 3.2 简单易用 3.3 通用性强 3.4 可以允许运行在很多地方 4. Spark框架模块 4.1 Spark Core 4.2 SparkSQL 4.3 SparkStreaming 4.4 MLlib 4.5 GraphX 5. Spark的运行模式 5.1 本地模式(单机) Local运行模…

《PCL多线程加速处理》-滤波-统计滤波

《PCL多线程加速处理》-滤波-统计滤波 一、效果展示二、实现方式三、代码一、效果展示 提升速度随着点云越多效果越明显 二、实现方式 1、原始的统计滤波实现方式 #include <pcl/filters/statistical_outlier_removal.h>pcl::PointCloud<pcl::PointXYZ

vue2-elementUI部分组件样式修改

el-radio样式&#xff1a; /deep/ .el-radio__input .el-radio__inner {width: 20px;height: 20px;position: relative;cursor: pointer;-webkit-appearance: none;-moz-appearance: none;appearance: none;border: 1px solid #999;border-radius: 0;outline: none;transition…

【C语言】超详解strncpystrncatstrncmpstrerrorperror的使⽤和模拟实现

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 ✏️真正相信奇迹的家伙&#xff0c;本身和奇迹一样了不起啊&#xff01; 欢迎大家关注&#x1f50d;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;>希望看完我的文章对你有小小的帮助&am…