SpringBoot的Starter自动化配置,自己编写配置maven依赖且使用及短信发送案例

目录

一、Starter机制

1. 是什么

2. 有什么用

3. 应用场景

二、短信发送案例

1. 创建

2. 配置 

3. 编写 

4. 形成依赖

6. 其他项目的使用

每篇一获


一、Starter机制

1. 是什么

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

SpringBoot中的starter也可以说是一种用于简化依赖管理和配置的工具。它们是一组预先配置好的依赖项和自动配置的模块,可以帮助开发人员快速地构建和部署SpringBoot应用程序。starter通常包含了所需的依赖项、自动配置和其他必要的设置,使开发人员可以更轻松地开始开发应用程序,而不必担心繁琐的配置和依赖项管理。SpringBoot提供了许多官方和第三方的starter,涵盖了各种不同的功能和需求,开发人员可以根据自己的需求选择合适的starter来加速应用程序的开发和部署过程。

2. 有什么用

在项目开发中使用SpringBoot Starter有以下几个好处:

1. 简化配置:SpringBoot Starter包含了一组预先配置好的依赖项和自动配置,可以帮助开发人员快速地构建和部署SpringBoot应用程序,减少了繁琐的配置工作。

2. 提高开发效率:使用SpringBoot Starter可以减少开发人员在配置和依赖项管理上的时间和精力,使开发人员可以更专注于业务逻辑的实现,从而提高开发效率。

3. 统一依赖管理:SpringBoot Starter可以帮助开发人员统一管理项目中的依赖项,避免因为版本冲突或者配置错误而导致的问题,简化了项目的依赖管理。

4. 提供标准化的配置:SpringBoot Starter提供了一种标准化的配置方式,使得不同的开发团队可以更容易地理解和维护项目的配置,降低了项目的维护成本。

总之,使用SpringBoot Starter可以帮助开发人员简化项目的配置和依赖管理,提高开发效率,降低项目的维护成本,是项目开发中的一个很好的选择。

3. 应用场景

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

常见应用场景

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

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

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

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

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

在日常开发工作中,常见的应用场景包括但不限于:

  1. Web应用开发:开发基于Web的应用程序,包括前端和后端开发,使用各种框架和技术栈进行开发。

  2. 数据库开发:设计和维护数据库,编写SQL查询和存储过程,进行数据库优化和性能调优。

  3. API开发:设计和开发RESTful API或GraphQL API,用于不同系统之间的数据交换和通信。

  4. 移动应用开发:开发iOS和Android应用程序,使用Swift、Kotlin、React Native等技术进行开发。

  5. 容器化和微服务:使用Docker、Kubernetes等技术进行应用的容器化和微服务化,实现应用的高可用和可扩展性。

  6. 云平台开发:在云平台上进行开发,包括AWS、Azure、Google Cloud等,利用云服务进行应用部署和管理。

  7. DevOps实践:实施持续集成、持续交付和持续部署,自动化测试和部署流程,提高开发和部署效率。

  8. 数据分析和人工智能:开发数据分析和人工智能应用,使用机器学习、深度学习等技术解决实际问题。

  9. 物联网应用开发:开发连接物联网设备的应用程序,处理传感器数据和控制设备。

  10. 安全和隐私保护:实施应用安全和隐私保护措施,包括身份认证、授权、数据加密等。

这些应用场景涵盖了软件开发的各个方面,开发人员根据具体项目需求和技术栈选择相应的开发方式和工具。

二、短信发送案例

1. 创建

新建一个Starter(启动项)的SpringBoot项目,创建如图 :

其中Starter(启动项)的SpringBoot项目的工件名命名规范

  • SpringBoot官方命名方式:

  • spring-boot-starter-{模块名}

   例如:spring-boot-starter-web

  • 自定义命名方式:

  • {模块名}-spring-boot-starter

    例如:mystarter-spring-boot-starter 

选择如图中的两项即可。

创建完成之后,就直接修改maven设置,设置为自己的本地仓库,将maven引进项目中。 

2. 配置 

将application.properties的文件换成.yml后缀的文件

所用的依赖,pom.xml 中引入

将其中的

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

依赖修改为以下依赖 (去掉其中的[ -web ])

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

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

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

pom.xml 所有依赖

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.CloudJun.depend</groupId><artifactId>sms-spring-boot-start</artifactId><version>0.0.1-SNAPSHOT</version><name>depend</name><description>depend</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.7.6</spring-boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!--starter项目的依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.cloudjun.depend.DependApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

starter项目中 application.yml 配置文件的配置如下 : 

#server:
#    port: 8080
sms:key: 2000secret: 2023enable: true

3. 编写 

创建 SmsProperties 短信配置类

package com.cloudjun.depend;import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/*** @author CloudJun* @create  2023-12-14 17:55*/
@Data
//@Component定义组件,交给spring进行管理
//@Component
//prefix = "sms"定义配置文件前缀,如果在yml文件中有sms前缀将进行匹配获取
@ConfigurationProperties(prefix = "sms")
public class SmsProperties {@Value("${sms.key}")private  String key;//应用标识@Value("${sms.secret}")private  String secret; //应用密钥private  String enable; //是否启用}

创建 ISmsService 接口

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

实现接口  SmsServiceImpl

package com.cloudjun.depend.service;import com.cloudjun.depend.SmsProperties;public class SmsServiceImpl implements ISmsService {private SmsProperties smsProperties; //nullpublic 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);}}

创建一个控制类 SmsConfig    ,service是否加载到spring里面去,(true)加载就使用这个依赖项目,(false)不加载就不使用这个依赖项目

package com.cloudjun.depend;import com.cloudjun.depend.service.ISmsService;
import com.cloudjun.depend.service.SmsServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
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;@Configuration  //表明当前类是一个配置类
@EnableConfigurationProperties({SmsProperties.class})//开启配置加载,加载指定的SmsProperties.class
//添加一个条件  (prefix):匹配.yml文件中sms前缀的 (name): 属性enable的 (havingValue): 值 true 为开启配置加载 false 为禁用配置加载
@ConditionalOnProperty(prefix = "sms",name = "enable",havingValue = "true")
public class SmsConfig {//控制当前的service是否加载到spring里面去@Autowiredprivate SmsProperties smsProperties;@Bean //该@Bean注解在方法上,表示该方法在spring运行的时候自动执行该方法,如有返回值,会被放到spring的容器中public ISmsService smsService(){return new SmsServiceImpl(smsProperties);}}

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

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

 配置指定的配置类

org.springframework.boot.autoconfigure.EnableAutoConfiguration
=com.cloudjun.depend.SmsConfig

在测试类中进行测试 DependApplicationTests

package com.cloudjun.depend;import com.cloudjun.depend.service.ISmsService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class DependApplicationTests {@Autowiredprivate SmsProperties smsProperties;@Autowiredprivate ISmsService iSmsService;@Testvoid contextLoads() {iSmsService.send("158","IKUN");}}

执行方法

展示的结果为 : 

4. 形成依赖

将完成好的Starter项目安装下载成依赖,操作如图 : 

在右侧点击Maven,打开生命周期,双击执行install

找到我们的Maven本地仓库的路径,在按照项目的组名进行查找,这个依赖是否已经完成。

在pom.xml文件中可以查询组名 : 

查询如图,有生成的依赖即可。

6. 其他项目的使用

我们在打开一个项目,在项目中增加这个依赖就可以使用短信发送的项目了

在新打开的项目中增加引用短信发送的项目的依赖

       <dependency><groupId>com.CloudJun.depend</groupId><artifactId>sms-spring-boot-start</artifactId><version>0.0.1-SNAPSHOT</version></dependency>

这里的引用是短信发送的项目中pom.xml文件中对应的groupId,artifactId,version

并且在新打开的项目中,找到.yml文件,增加配置

#定义应用
sms:key: 2000 #标识secret: 2023 #密钥enable: true #true 启用 false 禁用

在新打开的项目中,进行测试使用

每篇一获

学习以上这些技术可以为我们带来很多收获,包括但不限于:

1. 扩展技术视野:学习不同的技术和工具可以帮助我们拓宽技术视野,了解不同领域的发展趋势和最佳实践。

2. 提升解决问题的能力:掌握多种技术和工具可以帮助我们更好地解决复杂的问题,选择合适的技术栈和解决方案。

3. 增强适应能力:学习多种技术可以增强我们的适应能力,更快速地适应新的工作环境和项目需求。

4. 提高职业竞争力:掌握多种技术和工具可以提高我们在职场上的竞争力,更容易找到理想的工作机会。

5. 促进跨团队合作:了解多种技术可以更好地与其他团队成员合作,促进跨团队的协作和沟通。

6. 增加创新思维:学习多种技术可以激发我们的创新思维,帮助我们更好地解决问题和提出新的解决方案。

总之,学习多种技术可以为我们带来丰富的收获,有助于提升个人能力和职业发展。

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

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

相关文章

vite(一)——基本了解和依赖预构建

文章目录 一、什么是构建工具&#xff1f;1.为什么使用构建工具&#xff1f;2.构建工具的作用&#xff1f;3.构建工具怎么用&#xff1f; 二、经典面试题&#xff1a;webpack和vite的区别1.编译方式不同2.基础概念不同3.开发效率不同4.扩展性不同5.应用场景不同6.总结&#xff…

详细说说vuex

Vuex 是什么 Vuex有几个属性及作用注意事项vuex 使用举例Vuex3和Vuex4有哪些区别 创建 Store 的方式在组件中使用 Store辅助函数的用法响应式的改进Vuex4 支持多例模式 Vuex 是什么 Vuex是一个专门为Vue.js应用设计的状态管理构架&#xff0c;它统一管理和维护各个Vue组件的可…

C语言趣练习:两个字符串不用strcmp函数怎么比较大小

目录 1习题一&#xff1a;两个字符串不用strcmp函数怎么比较大小&#xff0c;并输出其差值 2不用strcpy函数将s2字符串中内容复制到s1中 3译密码问题 4总结&#xff1a; 1习题一&#xff1a;两个字符串不用strcmp函数怎么比较大小&#xff0c;并输出其差值 解题思路&#x…

MYSQL练题笔记-子查询-换座位

一、题目相关内容 1&#xff09;相关的表和题目 2&#xff09;帮助理解题目的示例&#xff0c;提供返回结果的格式 二、自己初步的理解 没啥思路&#xff0c;我还没做过交换的这种题&#xff0c;所以我觉得这类交换的题以后值得做一个合集&#xff0c;是有点灵活度在里面的&a…

【mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar安装】linux安装mysql5.7

之前安装的时候遇到了很多问题&#xff0c;浪费了一些时间。整理出这份教程&#xff0c;照着做基本一遍过。 这是安装包: 链接&#xff1a;https://pan.baidu.com/s/1gBuQBjA4R5qRYZKPKN3uXw?pwd1nuz 1.下载安装包&#xff0c;上传到linux。我这里就放到downloads目录下面…

猫粮选什么牌子好?好的主食冻干猫粮品牌十大排行

主食冻干猫粮作为一个猫咪的新主食产品越来越频繁的出现在各位猫主人们的视野中&#xff0c;但是国内的人对主食冻干猫粮的认知却仅仅止步于它是生肉制作而成&#xff0c;可以当作主食长期喂养猫咪&#xff0c;对于主食冻干猫粮的选购并没有更深入的思考和探索&#xff0c;如今…

大象elephant目标检测数据集VOC+YOLO格式2300张

大象是长鼻目象科的哺乳动物&#xff0c;有两个属&#xff0c;是世界上最大的陆生动物。其像柱子一样的四肢和宽厚的脚掌可以稳稳支撑住庞大的身体。巨大的头上长有蒲扇状的大耳朵和长且有弹性的鼻子。象耳上有丰富的血管&#xff0c;可以有效散热。鼻子和上唇合而为一的象鼻由…

【MATLAB】基于SVMD分解的信号去噪算法(基础版)

代码的使用说明 【MATLAB】基于SVMD去噪的信号去噪算法&#xff08;基础版&#xff09; 代码的原理 1.SVMD原理 连续变分模式分解&#xff08;Successive Variational Mode Decomposition&#xff0c;SVMD&#xff09;是一种用于将混合信号根据其频率特性分离成各个独立分量的…

Nginx rewrite 参数

目录 常用的Nginx 正则表达式 rewrite 和 location的区别 location location 大致分三类&#xff1a; location 常用的匹配规则&#xff1a; location 优先级&#xff1a; rewrite rewrite跳转实现 rewrite 执行顺序如下 语法格式 flag标记说明 rewrite实际操作 基…

Ubuntu服务设置

0. systemd介绍 Linux系统的systemd是第一个运行的进程&#xff0c;用来创建系统的守护进程&#xff0c;管理整个Linux系统。systemd支持并行启动守护进程&#xff0c;systemd初始化整个系统所需的资源。 0.1 systemd基本命令 systemctl systemctl是systemd中最基本的命令&a…

SQL命令---修改字段的数据类型

介绍 使用sql语句修改字段的数据类型。 命令 alter table 表明 modify 字段名 数据类型;例子 有一张a表&#xff0c;表里有一个id字段&#xff0c;长度为11。使用命令将长度修改为12 下面使用命令进行修改&#xff1a; alter table a modify id int(12) NOT NULL;下面使修…

绿盟 SAS堡垒机 local_user.php 权限绕过漏洞复现

绿盟 SAS堡垒机 local_user.php 权限绕过漏洞复现 一、 产品简介二、漏洞概述三、 复现环境四、漏洞复现五、小龙检测 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&…

Java数据类型相关

数据类型 Java有哪些数据类型 定义&#xff1a;Java语言是强类型语言&#xff0c;对于每一种数据都定义了明确的具体的数据类 型&#xff0c;在内存中分配了不同大小的内存空间。 分类&#xff1a; 基本数据类型 数值型 整数类型(byte,short,int,long) 浮点类型(float,dou…

实战章节:在Linux上部署各类软件

详细资料见文章的资源绑定 一、前言 1.1 为什么学习各类软件在Linux上的部署 在前面&#xff0c;我们学习了许多的Linux命令和高级技巧&#xff0c;这些知识点比较零散&#xff0c;同学们跟随着课程的内容进行练习虽然可以基础掌握这些命令和技巧的使用&#xff0c;但是并没…

Vue3-08-条件渲染-v-if 的基本使用

v-if 是什么 v-if 一个指令&#xff0c; 它是用来根据条件表达式&#xff0c;进行选择性地【展示】/【不展示】html元素的。比如 &#xff1a; 有一个按钮A&#xff0c;当条件为真时&#xff0c;展示该按钮&#xff1b;条件为假时&#xff0c;不展示该按钮。与 js 中的 条件判…

HBuilderX

HBuilderX.3.98.2023112510 HBuilderX-高效极客技巧 HBuilderX的项目结构&#xff1a; vue-cli的项目结构&#xff1a; HBuilderX的项目要脱离该工具用vue-cli启动的话&#xff0c;要把源代码拷贝到src里面&#xff0c;把项目结构修改后才可以启动完成。【知道我为什么很讨厌维…

孩子都能学会的FPGA:第三十一课——用FPGA实现SPI主机发送数据

&#xff08;原创声明&#xff1a;该文是作者的原创&#xff0c;面向对象是FPGA入门者&#xff0c;后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门&#xff0c;作者不光让大家知其然&#xff0c;还要让大家知其所以然&#xff01;每个工程作者都搭建了全自动化的仿…

什么时候使用匿名类,匿名类解决了什么问题?为什么需要匿名类 ?

匿名类通常在以下场景下使用&#xff1a; 一次性使用&#xff1a; 当你需要创建一个类的实例&#xff0c;但该类只在一个地方使用&#xff0c;而不打算在其他地方重复使用时&#xff0c;可以考虑使用匿名类。 简化代码&#xff1a; 当创建一个小型的、一次性的类会让代码更简洁…

赛氪为第五届全球校园人工智能算法精英大赛决赛选手保驾护航

12月10日&#xff0c;以“智青春算未来”为主题的2023年第五届全球校园人工智能算法精英大赛全国总决赛在河海大学江宁校区举行。本次大赛由江苏省人工智能学会主办&#xff0c;自9月份启动以来&#xff0c;共吸引了全国近400所高校的3000多支参赛团队参加。经过校赛、省赛选拔…

LeetCode1143.最长公共子序列

这道题看完就大概知道要用动态规划&#xff0c;然后想想如何建立动态转移方程&#xff0c;就很简单了&#xff0c;我都感觉我不是想出来的&#xff0c;是根据直觉应该是这样的然后边想边写就出来&#xff0c;以下是我的代码&#xff1a; class Solution {public int longestCom…