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

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

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

相关文章:

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

目录 一、Starter机制 1. 是什么 2. 有什么用 3. 应用场景 二、短信发送案例 1. 创建 2. 配置 3. 编写 4. 形成依赖 6. 其他项目的使用 每篇一获 一、Starter机制 1. 是什么 SpringBoot中的starter是一种非常重要的机制(自动化配置)&#xff0c;能够抛弃以前繁杂…...

<蓝桥杯软件赛>零基础备赛20周--第9周--前缀和与差分

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周&#xff08;读者可以按…...

LeetCode-2487. 从链表中移除节点【栈 递归 链表 单调栈】

LeetCode-2487. 从链表中移除节点【栈 递归 链表 单调栈】 题目描述&#xff1a;解题思路一&#xff1a;可以将链表转为数组&#xff0c;然后从后往前遍历&#xff0c;遇到大于等于当前元素的就入栈&#xff0c;最终栈里面的元素即是最终的答案。解题思路二&#xff1a;递归&am…...

Redisson分布式锁原理分析

1.Redisson实现分布式锁 在分布式系统中&#xff0c;涉及到多个实例对同一资源加锁的情况&#xff0c;传统的synchronized、ReentrantLock等单进程加锁的API就不再适用&#xff0c;此时就需要使用分布式锁来保证多服务之间加锁的安全性。 常见的分布式锁的实现方式有&#xff…...

【Linux】:线程(二)互斥

互斥与同步 一.线程的局部存储二.线程的分离三.互斥1.一些概念2.上锁3.锁的原理4.死锁 一.线程的局部存储 例子 可以看到全局变量是所有线程共享的&#xff0c;如果我们想要每个线程都单独访问g_val怎么办呢&#xff1f;其实我们可以在它前面加上__thread修饰。 这就相当于把g…...

vscode报错Pylance client: couldn‘t create connection to server.

问题描述&#xff1a; 一打开vscode&#xff0c;右下角就弹报错&#xff0c;Pylance client: couldn’t create connection to server.&#xff0c;让我打开output&#xff0c;打开后似乎是在说连不上server 因为连不上server&#xff0c;所以我的python代码没法解析&#xff0…...

智能优化算法应用:基于萤火虫算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于萤火虫算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于萤火虫算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.萤火虫算法4.实验参数设定5.算法结果6.参考文…...

MacOS多屏状态栏位置不固定,程序坞不小心跑到副屏

目录 方式一&#xff1a;通过系统设置方式二&#xff1a;鼠标切换 MacOS多屏状态栏位置不固定&#xff0c;程序坞不小心跑到副屏 方式一&#xff1a;通过系统设置 先切换到左边 再切换到底部 就能回到主屏了 方式二&#xff1a;鼠标切换 我的两个屏幕放置位置如下 鼠标在…...

Python:pipdeptree 语法介绍

相信大家在按照一些包的时候经常会碰到版本不兼容&#xff0c;但是又不知道版本之间的依赖关系&#xff0c;今天给大家介绍一个工具&#xff1a;pipdeptree pipdeptree 是一个 Python 包&#xff0c;用于查看已安装的 pip 包及其依赖关系。它以树形结构展示包之间的依赖关系&am…...

【问题处理】—— lombok 的 @Data 大小写区分不敏感

问题描述 今天在项目本地编译的时候&#xff0c;发现有个很奇怪的问题&#xff0c;一直提示某位置找不到符号&#xff0c; 但是实际在Idea中显示确实正常的&#xff0c;一开始以为又是IDEA的故障&#xff0c;所以重启了IDEA&#xff0c;并执行了mvn clean然后重新编译。但是问…...

跟着我学Python基础篇:08.集合和字典

往期文章 跟着我学Python基础篇&#xff1a;01.初露端倪 跟着我学Python基础篇&#xff1a;02.数字与字符串编程 跟着我学Python基础篇&#xff1a;03.选择结构 跟着我学Python基础篇&#xff1a;04.循环 跟着我学Python基础篇&#xff1a;05.函数 跟着我学Python基础篇&#…...

Tomcat部署(图片和HTML等)静态资源时遇到的问题

文章目录 Tomcat部署静态资源问题图中HTML代码启动Tomcat后先确认Tomcat是否启动成功 Tomcat部署静态资源问题 今天&#xff0c;有人突然跟我提到&#xff0c;使用nginx部署静态资源&#xff0c;如图片。可以直接通过url地址访问&#xff0c;为什么他的Tomcat不能通过这样的方…...

在接触新的游戏引擎的时候,如何能快速地熟悉并开发出一款新游戏?

引言 大家好&#xff0c;今天分享点个人经验。 有一定编程经验或者游戏开发经验的小伙伴&#xff0c;在接触新的游戏引擎的时候&#xff0c;如何能快速地熟悉并开发出一款新游戏&#xff1f; 利用现成开发框架。 1.什么是开发框架&#xff1f; 开发框架&#xff0c;顾名思…...

计网 - TCP四次挥手原理全曝光:深度解析与实战演示

文章目录 Pre导图过程分析抓包实战第一次挥手 【FIN ACK】第二次挥手 【ACK】第三次挥手 【FINACK】第四次挥手 【ACK】 小结 Pre 计网 - 传输层协议 TCP&#xff1a;TCP 为什么握手是 3 次、挥手是 4 次&#xff1f; 计网 - TCP三次握手原理全曝光&#xff1a;深度解析与实战…...

个人养老金知多少?

个人养老金政策你了解吗&#xff1f;税优政策你知道吗&#xff1f;你会计算能退多少税吗&#xff1f;… 点这里看一看...

gpt3、gpt2与gpt1区别

参考&#xff1a;深度学习&#xff1a;GPT1、GPT2、GPT-3_HanZee的博客-CSDN博客 Zero-shot Learning / One-shot Learning-CSDN博客 Zero-shot&#xff08;零次学习&#xff09;简介-CSDN博客 GPT1、GPT2、GPT3、InstructGPT-CSDN博客 目录 gpt2与gpt1区别&#xff1a; gp…...

PyQt6 QDateEdit日期控件

​锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计39条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话…...

【无线网络技术】——无线城域网(学习笔记)

&#x1f4d6; 前言&#xff1a;无线城域网&#xff08;WMAN&#xff09;是指在地域上覆盖城市及其郊区范围的分布节点之间传输信息的本地分配无线网络。能实现语音、数据、图像、多媒体、IP等多业务的接入服务。其覆盖范围的典型值为3~5km&#xff0c;点到点链路的覆盖可以高达…...

RK3568平台 OTA升级原理

一.前言 在迅速变化和发展的物联网市场&#xff0c;新的产品需求不断涌现&#xff0c;因此对于智能硬件设备的更新需求就变得空前高涨&#xff0c;设备不再像传统设备一样一经出售就不再变更。为了快速响应市场需求&#xff0c;一个技术变得极为重要&#xff0c;即OTA空中下载…...

mysql迁移步骤

MySQL迁移是指将MySQL数据库从一台服务器迁移到另一台服务器。这可能是因为您需要升级服务器、增加存储空间、提高性能或改变数据库架构。 以下是MySQL迁移的一般步骤&#xff1a; 以上是MySQL迁移的一般步骤&#xff0c;具体步骤可能因您的环境和需求而有所不同。在进行迁移之…...

计算机网络应用层(期末、考研)

计算机网络总复习链接&#x1f517; 目录 DNS域名服务器域名解析过程分类递归查询&#xff08;给根域名服务器造成的负载过大&#xff0c;实际中几乎不用&#xff09;迭代查询 域名缓存&#xff08;了解即可&#xff09;完整域名解析过程采用UDP服务 FTP控制连接与数据连接 电…...

Jenkins离线安装部署教程简记

前言 在上一篇文章基于Gitee实现Jenkins自动化部署SpringBoot项目中&#xff0c;我们了解了如何完成基于Jenkins实现自动化部署。 对于某些公司服务器来说&#xff0c;是不可以连接外网的&#xff0c;所以笔者专门整理了一篇文章总结一下&#xff0c;如何基于内网直接部署Jen…...

如果一个嵌套类需要在单个方法之外仍然是可见,或者它太长,不适合放在方法内部,就应该使用成员类。

当一个嵌套类需要在单个方法之外仍然是可见&#xff0c;或者它太长不适合放在方法内部时&#xff0c;可以考虑使用成员类&#xff08;成员内部类&#xff09;。成员类是声明在类的内部但不是在方法内部的类&#xff0c;可以访问外部类的实例成员。 以下是一个示例&#xff0c;…...

Vue3 中的 Proxy--读懂ES6中的Proxy

Proxy用于创建一个对象的代理&#xff0c;从而实现基本操作的拦截和自定义&#xff08;如属性查找、赋值、枚举、函数调用等&#xff09; 1.用法 Proxy为 构造函数&#xff0c;用来生成 Proxy实例 var proxy new Proxy(target, handler)参数 target表示所要拦截的目标对象…...

zk_dubbo

图灵面试笔记 zk dubbo spi dubbo 文章 dubbo与spring整合之Service、Reference注解处理过程 JAVA备忘录...

Windows 安全基础——NetBIOS篇

Windows 安全基础——NetBIOS篇 1. NetBIOS简介 NetBIOS&#xff08;Network Basic Input/Output System, 网络基本输入输出系统&#xff09;是一种接入服务网络的接口标准。主机系统通过WINS服务、广播及lmhosts文件多种模式&#xff0c;把NetBIOS名解析对应的IP地址&#xf…...

【基础知识】Hadoop生态系统

Hadoop是一个开源的分布式计算框架,主要用于大数据的存储和处理&#xff0c;即一个包含多种组件的综合分布式系统,组件相互协作完成从数据存储到计算分析的完整功能。 关键词——容灾 主从结构、多副本 主要特点 分布式存储 - Hadoop采用HDFS文件系统,可以将大数据分布式存…...

[Linux] LAMP架构

一、LAMP架构架构的概述 LAMP 架构是一种流行的 Web 应用程序架构&#xff0c;它的名称是由四个主要组件的首字母组成的&#xff1a; Linux&#xff08;操作系统&#xff09;&#xff1a; 作为操作系统&#xff0c;Linux 提供了服务器的基础。它负责处理硬件资源、文件系统管理…...

HPM5300系列--第二篇 Visual Studio Code开发环境以及多种调试器调试模式

一、目的 在博文《HPM5300系列--第一篇 命令行开发调试环境搭建》、《HPM6750系列--第四篇 搭建Visual Studio Code开发调试环境》中我们介绍了命令行方式开发环境&#xff0c;也介绍了HPM6750evkmini开发板如何使用Visual Studio Code进行开发调试&#xff08;其中调试方式使用…...

LeetCode2697. Lexicographically Smallest Palindrome

文章目录 一、题目二、题解 一、题目 You are given a string s consisting of lowercase English letters, and you are allowed to perform operations on it. In one operation, you can replace a character in s with another lowercase English letter. Your task is t…...