【SpringBoot】从入门到精通的快速开发指南

🎉🎉欢迎来到我的CSDN主页!🎉🎉
🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚
🌟推荐给大家我的专栏《SpringBoot》。🎯🎯
👉点击这里,就可以查看我的主页啦!👇👇
Java方文山的个人主页
🎁如果感觉还不错的话请给我点赞吧!🎁🎁
💖期待你的加入,一起学习,一起进步!💖💖

目录
一、SpringBoot简介
1.1.什么是SpringBoot
1.2.为什么要学习SringBoot
1.3.SpringBoot的特点
二、入门SpringBoot
2.1.创建SpringBoot项目
2.1.1.测试springboot
2.2.集成mybatis
2.2.1.properties修改为.yml
2.2.2.添加mybatis配置文件
2.2.3.生成mapper代码
2.2.4.测试连接数据库
2.3.集成pagehelper
2.3.1.基础使用pagehelper
2.3.2.AOP使用pagehelper
2.4.集成druid
三、注意事项
3.1.SpringBoot换源失败
3.2.代码不加载
3.3.yml文件注意格式
3.4.IDEA连接数据库错误
一、SpringBoot简介
1.1.什么是SpringBoot
Spring Boot 是由 Pivotal 团队提供的全新框架,2014 年 4 月发布 Spring Boot 1.0 2018 年 3 月 Spring Boot 2.0发布。它是对spring的进一步封装,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程。怎么简化的呢?就是通过封装、抽象、提供默认配置等方式让我们更容易使用。
SpringBoot 基于 Spring 开发。SpringBoot 本身并不提供 Spring 框架的核心特性以及扩展功能,也就是说,它并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具。
关于 SpringBoot 有一句很出名的话就是约定大于配置。采用 Spring Boot 可以大大的简化开发模式,它集成了大量常用的第三方库配置,所有你想集成的常用框架,它都有对应的组件支持,例如 Redis、MongoDB、Jpa、kafka,Hakira 等等。SpringBoot 应用中这些第三方库几乎可以零配置地开箱即用,大部分的 SpringBoot 应用都只需要非常少量的配置代码,开发者能够更加专注于业务逻辑。
1.2.为什么要学习SringBoot
众所周知 Spring 应用需要进行大量的配置,各种 XML 配置和注解配置让人眼花缭乱,且极容易出错,因此 Spring 一度被称为“配置地狱”。为了简化 Spring 应用的搭建和开发过程,Pivotal 团队在 Spring 基础上提供了一套全新的开源的框架,它就是Spring Boot。
只是为了提升Spring开发者的工具,特点:敏捷式、快速开发。
-
快速上手:Spring Boot 提供了一套简化的开发模型和自动配置机制,使得开发者能够快速搭建起一个可运行的应用程序。相比传统的 Spring 开发,Spring Boot 大大简化了繁琐的配置过程,让开发者能够更专注于业务逻辑的实现。
-
生态丰富:Spring 生态系统非常庞大,Spring Boot 在此基础上提供了更加便捷的开发方式。它内置了许多常用的库和工具,如数据库访问、Web 开发、安全认证等,使得开发者能够更轻松地集成这些功能,而无需自己手动配置。
-
高效开发:Spring Boot 提供了许多开发中常用的功能和组件,如自动装配、自动配置、监控和管理等,极大地提高了开发效率。通过使用 Spring Boot,开发者可以快速构建出高质量的应用程序,同时还能够更加方便地进行测试、部署和维护。
-
社区支持广泛:Spring Boot 是 Spring 社区的重要组成部分,因此拥有一个庞大的社区支持。无论是在官方文档、教程还是开源社区中,都能够找到大量的资源和解决方案,帮助开发者解决问题、学习和提高。
1.3.SpringBoot的特点
-
独立运行的 Spring 项目
Spring Boot 可以以 jar 包的形式独立运行,Spring Boot 项目只需通过命令“ java–jar xx.jar” 即可运行。
-
内嵌 Servlet 容器
Spring Boot 使用嵌入式的 Servlet 容器(例如 Tomcat、Jetty 或者 Undertow 等),应用无需打成 WAR 包 。
-
提供 starter 简化 Maven 配置
Spring Boot 提供了一系列的“starter”项目对象模型(POMS)来简化 Maven 配置。
-
提供了大量的自动配置
Spring Boot 提供了大量的默认自动配置,来简化项目的开发,开发人员也通过配置文件修改默认配置。
-
自带应用监控
Spring Boot 可以对正在运行的项目提供监控。
-
无代码生成和 xml 配置
Spring Boot 不需要任何 xml 配置即可实现 Spring 的所有配置。
二、入门SpringBoot
2.1.创建SpringBoot项目
①打开Idea点击 + Create New Project,选择 Spring Initializr。

②点击Next下一步

③勾选所需依赖

点击Next下一步,最后点击Finish即可完成SpringBoot项目的创建。
2.1.1.测试springboot
插件之间可能存在配置关系,比如Mybatis Framework,这个插件就是需要自己配置数据库,如果不配置,那么启动项目是会报错的,所以我们来配置一下避免运行时报错,我们这里使用的是不添加数据库配置,加入注解直接让其排除自动配置
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

启动后看见如下图就说明启动成功了(SpringBoot不需要配置Tomcat,他内嵌了一个在里面)

为了能比较的清楚的看到效果,我们在 com.zking.springboot 包下又创建一个 controller 包,并在该包内创建一个名为 HelloController 的 Controller,代码如下:
@RestController
public class HelloController {@RequestMapping("/hello")public String hello(){return "Hello SpringBoot!!!";}
}
启动SpringBoot后访问路径得到如下图,说明我们的SpringBoot项目以及搭建好了

2.2.集成mybatis
2.2.1.properties修改为.yml
在这之前,我们需要做一件事情,下载插件 Convert YAML and Properties File

该插件是将我们的配置文件.properties直接变成.yml,这样的好处是什么呢?这样可以更直观的知道我们所配置的信息,让我们的配置变得有层级更好的管理。
原properties

修改成yml

下载好插件,重启IDEA后选择properties文Convert YAML and Properties File即可

2.2.2.添加mybatis配置文件
配置pom.xml,导入依赖:
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.0</version></dependency>
在创建springboot项目的时候勾选了,就不用管。
往application.yml或application.properties文件,添加以下配置:
#mybatis配置
mybatis:#配置SQL映射文件路径mapper-locations: classpath:mapper/*.xml#配置别名type-aliases-package: com.csdn.springboot.pojo
在启动类上添加@MapperScan注解:
@MapperScan({"com.csdn.springboot.mapper"})

2.2.3.生成mapper代码
①点击Datebase后点击加号进行mysql连接

②填写相应信息

③ 在需要生成代码的表上右击MybatisX-Generator

④生成mapper代码

至此我们的代码就生成好了

2.2.4.测试连接数据库
代码生成完成了下面我们测试一下
mapper.xml
<select id="selectBook" resultMap="BaseResultMap">select<include refid="Base_Column_List" />from t_book</select>
mapper
@Repository
public interface TBookMapper {List<TBook> selectBook();
}
service
public interface TBookService {List<TBook> selectBook();
}
serviceimpl
@Service
public class TBookServiceImpl implements TBookService {@Autowiredprivate TBookMapper tBookMapper;@Overridepublic List<TBook> selectBook() {return tBookMapper.selectBook();}
}
controller
@RestController
@RequestMapping("/book")
public class TBookController {@Autowiredprivate TBookService tbookservice;@RequestMapping("/list")public Object list(){return tbookservice.selectBook();}
}
请求访问路径:http://localhost:8080/book/list

2.3.集成pagehelper
2.3.1.基础使用pagehelper
普通的查询肯定不满住我们日常需求,按道理肯定是只查询一部分数据显示给用户看,这就需要用到pagehelper依赖了,通过它进行分页查询。
配置pom.xml,导入依赖:
<!-- 分页依赖--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.6</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>
application.yml或application.properties文件,添加以下配置:
#pagehelper分页插件配置
pagehelper:#sql“方言”helperDialect: mysql#开启分页合理化reasonable: true#mapper方法上的参数supportMethodsArguments: true#查询数量params: count=countSql
我这里先测试一下,手动设置查询条件

这时,我们的数据就会是分页的了,不再是一次性全部查询出来

2.3.2.AOP使用pagehelper
先准备三样东西,PageBean\PageAspect\PageAnnotation
PageBean
package com.csdn.boot.page;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class PageBean {private Integer page = 1;private Integer rows = 5;private Long total = 0L;private boolean open = true;public int start() {return (page - 1) * rows;}public int previous() {return Math.max(this.page - 1, 1);}public int next() {return Math.min(this.page + 1, maxPage());}public int maxPage() {return (int) Math.ceil(this.total.intValue() / (this.rows * 1.0));}}
PageAspect
package com.csdn.boot.page;import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;@Aspect
@Component
public class PageAspect {@Pointcut("@annotation(PageAnnotation)")public void cut() {}@Around("cut()")public Object aroundHandler(ProceedingJoinPoint point) throws Throwable {Object[] args = point.getArgs();PageBean pageBean = new PageBean().setOpen(false);for (Object arg : args) {if (arg instanceof PageBean) pageBean = (PageBean) arg;}PageHelper.startPage(pageBean.getPage(), pageBean.getRows(), pageBean.isOpen());Object val = point.proceed();if (pageBean.isOpen()) {Page<?> page = (Page<?>) val;pageBean.setTotal(page.getTotal());}return val;}}
PageAnnotation
package com.csdn.boot.page;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PageAnnotation {
}
准备好了后,就可对我们的代码进行修改了
controller层
@RequestMapping("/list")public Object list(PageBean pageBean) {PageHelper.startPage(pageBean.getPage(),pageBean.getRows());return tbookservice.selectBook(pageBean);}
}
service层
public interface TBookService {List<TBook> selectBook(PageBean pageBean);}
serviceimpl层
@Service
public class TBookServiceImpl implements TBookService {@Autowiredprivate TBookMapper tBookMapper;@PageAnnotation@Overridepublic List<TBook> selectBook(PageBean pageBean) {return tBookMapper.selectBook();}
}
演示效果:

2.4.集成druid

Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。

配置pom.xml,导入依赖:
<!--druid连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.15</version></dependency>
application.yml或application.properties文件,添加以下配置:
spring:datasource:#1.JDBCtype: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/vue?useUnicode=true&characterEncoding=utf8&useSSL=falseusername: rootpassword: 1234druid:#2.连接池配置#初始化连接池的连接数量 大小,最小,最大initial-size: 5min-idle: 5max-active: 20#配置获取连接等待超时的时间max-wait: 60000#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒time-between-eviction-runs-millis: 60000# 配置一个连接在池中最小生存的时间,单位是毫秒min-evictable-idle-time-millis: 30000validation-query: SELECT 1 FROM DUALtest-while-idle: truetest-on-borrow: truetest-on-return: false# 是否缓存preparedStatement,也就是PSCache 官方建议MySQL下建议关闭 个人建议如果想用SQL防火墙 建议打开pool-prepared-statements: truemax-pool-prepared-statement-per-connection-size: 20# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙filter:stat:merge-sql: trueslow-sql-millis: 5000#3.基础监控配置web-stat-filter:enabled: trueurl-pattern: /*#设置不统计哪些URLexclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"session-stat-enable: truesession-stat-max-count: 100stat-view-servlet:enabled: trueurl-pattern: /druid/*reset-enable: true#设置监控页面的登录名和密码login-username: adminlogin-password: adminallow: 127.0.0.1#deny: 192.168.1.100
我们直接重启服务器随便发个请求到后端,根据监控页面的网址进行访问


就可以在这里实时监控到用户发送的请求了

三、注意事项
3.1.SpringBoot换源失败
不知道大家有没有见过以下图片,该图片就是Spring Initializr创建项目换源,出现的错误
解决办法:
① 用阿里云https://start.aliyun.com/ 地址直接替代或者使用大佬的http://start.springboot.io/即可
② 直接进入spring提供的官网后如果没有合适自己的jdk版本也没关系,直接在构建完的springboot项目中修改pom.xml文件即可。
注意选择Custom

3.2.代码不加载
我们的代码要放到与启动类同级包下,否则访问不到该资源,如果是静态资源或者配置文件请放入resources文件下。

3.3.yml文件注意格式
正确的层级关系
在这个例子中,我们将创建一个包含一些用户信息的yml文件。
users:- name: Aliceage: 28gender: Female- name: Bobage: 34gender: Male
在这个例子中,我们的层级关系是正确的。users是顶级键,它下面有两个列表元素,每个元素都是一个字典,表示一个具体的用户。
错误的层级关系
现在让我们看一下错误的层级关系。在这个例子中,我们将创建一个包含用户信息的yml文件,但是我们不小心缩进了一些键。
users:
- name: Aliceage: 28gender: Female
- name: Bobage: 34gender: Male
在这个例子中,我们缩进了gender键,导致它的层级关系不正确。因此,这个yml文件是无效的。
3.4.IDEA连接数据库错误

可以在连接字符串中添加"serverTimezone"属性并设置正确的时区值
jdbc:mysql://localhost:3306/bookshop?serverTimezone=UTC


到这里我的分享就结束了,欢迎到评论区探讨交流!!
💖如果觉得有用的话还请点个赞吧 💖

相关文章:
【SpringBoot】从入门到精通的快速开发指南
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《SpringBoot》。🎯🎯 &…...
每日一练【长度最小的子数组】
一、题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 二、题目解析 经…...
HTML 块级元素与行内元素有哪些以及注意、总结
行内元素和块级元素是HTML中的两种元素类型,它们在页面中的显示方式和行为有所不同。 块级元素(Block-level Elements): 常见的块级元素有div、p、h1-h6、ul、ol、li、table、form等。 块级元素会独占一行,即使没有…...
SpringBoot热部署
SpringBoot热部署 借鉴链接🔗:SpringBoot中的热部署 添加devtools依赖和pom插件 <!-- devtools 依赖 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId&…...
Jmeter入门
一、下载jmeter 官网下载 下载之后解压,在目录/bin下面找到jmeter.bat双击之后即可启动Jmeter。 二、使用 如下左图,选择语言为中文,可以修改测试计划的名称。如下右图,添加线程组 添加线程组 添加http请求 路径传参方式 …...
go集成nacos
1,go集成nacos 注册实例与注销实例 package mainimport ("fmt""github.com/nacos-group/nacos-sdk-go/clients""github.com/nacos-group/nacos-sdk-go/clients/naming_client""github.com/nacos-group/nacos-sdk-go/common/constant"…...
NLP项目实战01--电影评论分类
介绍: 欢迎来到本篇文章!在这里,我们将探讨一个常见而重要的自然语言处理任务——文本分类。具体而言,我们将关注情感分析任务,即通过分析电影评论的情感来判断评论是正面的、负面的。 展示: 训练展示如下…...
Linux vmstat命令:监控系统资源
vmstat命令,是 Virtual Meomory Statistics(虚拟内存统计)的缩写,可用来监控 CPU 使用、进程状态、内存使用、虚拟内存使用、硬盘输入/输出状态等信息。此命令的基本格式有如下 2 种: [rootlocalhost ~]# vmstat [-a…...
php爬虫规则与robots.txt讲解
在进行网页爬虫时,有一些规则需要遵守,以避免违反法律,侵犯网站隐私和版权,以及造成不必要的麻烦。以下是一些常见的PHP爬虫规则: 1. 尊重网站的使用条款:在开始爬取之前,请确保你阅读并理解了…...
Ray使用备注
Ray使用备注 框架介绍 Ray是一种python分布式任务调度框架其支持 无状态的任务并发执行,也支持 有状态的任务按照一定顺序执行其支持 分布式调度器,在一个节点上创建的任务先给本节点的局部调度器,并让本节点自己处理,当资源不够时,再将任务发给全局调度器供其他节点处理其支…...
个人介绍以及毕业去向
CSDN陪伴我从大一到大四,后面也会接着用 写一点大学四年的总结 #总结#理工科#留学 211大学 弃保出国 智能科学与技术 均分88.9 EI论文一篇 数学竞赛和数学建模均为省二 大创评为国家级 全国大学生计算机设计大赛国家三等奖 百度Paddle、大疆RoboMaster、Phytium Te…...
原创度检测,在线文章原创度检测
原创度检测,作为数字时代中内容创作者和学术界广泛关注的话题,正逐渐成为保障知识产权、促进创新发展的不可或缺的工具。今天,我们将深入介绍原创度检测的定义、意义、技术原理、应用领域以及未来趋势。 一、什么是原创度检测? 原…...
windows下安装git中文版客户端
下载git Windows客户端 git客户端下载地址:Git - Downloads 我这里下载的是Git-2.14.0-64-bit.exe版本 下载TortoiseGit TortoiseGit客户端下载地址:Download – TortoiseGit – Windows Shell Interface to Git TortoiseGit客户端要下载两个&#…...
短视频怎么批量添加水印logo
在现代数字化时代,视频内容已经成为我们日常生活中不可或缺的一部分。然而,当我们辛辛苦苦制作的视频在网络上分享时,常常会遇到被他人盗用或未经授权使用的情况。为了保护我们的创作成果,给视频添加水印logo成为了一种常见的手段…...
一文入门 UUID
UUID简介 UUID代表Universally Unique Identifier,译为全局一标识符。它是一种由软件构建的标准化身份验证方案,用于确保跨多个上下文中的对象都具有唯一性。UUID在各种系统之间确保了严格的唯一性,因此即使在大型分布式环境中,也…...
kafka学习笔记--broker工作流程、重要参数
本文内容来自尚硅谷B站公开教学视频,仅做个人总结、学习、复习使用,任何对此文章的引用,应当说明源出处为尚硅谷,不得用于商业用途。 如有侵权、联系速删 视频教程链接:【尚硅谷】Kafka3.x教程(从入门到调优…...
多合一iPhone 解锁工具:iMyFone LockWiper iOS
多合一iPhone 解锁工具 无需密码解锁 iPhone/iPad/iPod touch 上所有类型的屏幕锁定 在几分钟内解锁 iPhone Apple ID、Touch ID 和 Face ID 立即绕过 MDM 并删除 iPhone/iPad/iPod touch 上的 MDM 配置文件 支持所有 iOS 版本和设备,包括最新的 iOS 17 和 iPhone 1…...
在设计和考虑建造室外雨水收集池时需要注意的因素
在设计和建造室外雨水收集池时,需要考虑以下因素: 地质条件:建造雨水收集池需要考虑到地质条件,例如土壤类型、地基承载能力等。这些因素可能对水池的建造和结构产生影响。 气候条件:不同地区的降雨量、湿度、气温等…...
C_5练习题答案
一、单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中,选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) 下列叙述中错误的是(D)。A.计算机不能直接执行用C语言编写的源程序 B.C程序经C编译程序编译后,生成扩展名为obj的文件是一个二…...
使用 Axios 进行网络请求的全面指南
使用 Axios 进行网络请求的全面指南 本文将向您介绍如何使用 Axios 进行网络请求。通过分步指南和示例代码,您将学习如何使用 Axios 库在前端应用程序中发送 GET、POST、PUT 和 DELETE 请求,并处理响应数据和错误。 准备工作 在开始之前,请…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...

