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

SpringBoot基础认识

创建SpringBoot模块

首先需要引设置maven并引用maven环境

1.打开项目结构,new module,选择Spring Initializr,URL选默认:

group填写分组如com.kdy  , Artifact起个模块名如springboot_quickstart,Type选择Maven  , Language为Java  ,packing选择jar , Java版本选择8 , version自定义 , name和Description不重要 , Package填写包名如com.kdy。

2.next后,选择某个稳定版如2.5.4,依赖里面勾选Web下的Spring Web依赖:

Spring Web:Build web, including RESTful, applications using Spring MVC. UsesApache Tomcat as the default embedded container.

SpringWeb:使用SpringMVC.UsesApacheTomcat作为默认的嵌入式容器构建Web,包括RESTful和上下文applicaiton。

3.next,起个模块名可用和Artifict一样如springboot_quickstart666,选择位置。finish。

4.打开这个springboot模块,先找到pom文件刷新maven,将spring web的spring-boot-start-parent和spring-boot-starter-web和spring-boot-starter-test三个starter加载进来。Java版本和packaging打包方式也都可以在pom文件中调。

5.项目结构:

src和pom文件,src包含main和test,main包含Java和resource,Java包含包com.kdy,包下有个引导类。resource下static文件夹和template文件夹和application.properties配置文件,test包含Java,Java包含com.kdy包,包里有测试类。

入门

com.kdy.controller中创建BookController

@RestController
@RequestMapping("/books")
public class BookController {@GetMappingpublic String getById(){System.out.println("springboot is running...");return "springboot is running";}
}

启动引导类,访问8080加controller即可 

和spring区别

spring阶段需要写web.xml文件并配置,springboot不用了。现在不需要配置spring核心配置和springmvc的配置了。

隐藏左侧目录冗余文件夹或文件

Setting -> editor -> File Types -> lgnored Files and Folders,+上名想忽略的文件名,也用*.imi这种*号进行占位。

SpringBoot和Spring的区别

SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程。

spring缺点:依赖设置繁琐配置繁琐。sprignboot优点:起步依赖(简化依赖配置)
自动配置(简化常用工程相关配置)辅助功能(内置服务器,......

Parent

版本管理,防止版本冲突。

所有SpringBoot项目要继承的项目,定义了若干个坐标版本号(依赖管理,而非依赖),以达到减少依赖冲突的目的。spring-boot-starter-arent各版本间存在着诸多坐标版本不同

Start

start的就是含有很多依赖的依赖,springboot中有很多这样的start依赖传递的方式的start的依赖,所以就简便了很多。

以达到减少依赖配置的目的。

引导类

@SpringBootApplication
public class SpringbootBeginQuickstartApplication {public static void main(String[] args) {SpringApplication.run(SpringbootBeginQuickstartApplication.class, args);}
}

SpringApplication.run的就是一个容器

@SpringBootApplication
public class SpringbootBeginQuickstartApplication {public static void main(String[] args) {ConfigurableApplicationContext ctx = SpringApplication.run(SpringbootBeginQuickstartApplication.class, args);BookController bean = ctx.getBean(BookController.class);System.out.println(bean);//com.kdy.controller.BookController@6e28bb87}
}

当然,你也可用@Component标柱的类也会到容器中。 

 @SpringBootApplication标记为springboot配置类。

内含@SpringBootConfiguration-》@Configuration内涵@ComponentScan

内嵌tomcat

spring-boot-starter-web中有spring-boot-starter-tomcat有tomcat-embed-core。

程序启动就是通过这个tomcat的核心core发布的。

当然,我们也可将其换为:

		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</artifactId></dependency>

Jetty比Tomcat更轻量级,可扩展性更强(相较于Tomcat),谷歌应用引擎(GAE)已经全面切换为Jetty。

RestFul风格开发

@Controller与@ResponseBody=@RestController,设置当前controller为restFul风格

/*@Controller
@ResponseBody*/
@RestController("/users")//同时提取下面restfu风格的统一路径
public class UserController {
/*    @RequestMapping("/save")@ResponseBodypublic String save(@RequestBody User user){System.out.println("user save"+user);return "{'model':'user save'}";//手写json}@RequestMapping("/delete")@ResponseBodypublic String delete(Integer id){System.out.println("user delete"+id);return "{'model':'user delete'}";}@RequestMapping("/update")@ResponseBodypublic String update(@RequestBody User user){System.out.println("user update"+user);return "{'model':'user update'}";}*///restful//@RequestMapping(value = "/users",method = RequestMethod.POST)改为如下@PostMapping//@ResponseBody 提到controller上了public String save2(@RequestBody User user){System.out.println("user save"+user);return "{'model':'user save'}";//手写json}//@RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE)改为如下@DeleteMapping("/{id}")//@ResponseBody 提到controller上了public String delete2(@PathVariable("id") Integer id){System.out.println("user delete"+id);return "{'model':'user delete'}";}//@RequestMapping(value = "/users",method = RequestMethod.PUT)改为如下@PutMapping//@ResponseBody 提到controller上了public String update2(@RequestBody User user){System.out.println("user update"+user);return "{'model':'user update'}";}//@RequestMapping(value = "/users/{id}",method = RequestMethod.GET)改为如下@GetMapping("/{id}")//@ResponseBody 提到controller上了public String getById(@PathVariable("id") Integer id){System.out.println("user getById"+id);return "{'model':'user getById'}";}//@RequestMapping(value = "/users",method = RequestMethod.GET)改为如下@GetMapping//@ResponseBody 提到controller上了public String getAll(){System.out.println("user getaLL");return "{'model':'user getaLL'}";}
}

@RequestBody与@RequestParam与@PathVariable的区别:

@RequestParam用于接收url地址传参或表单传参

@RequestBody用于接收json数据
@PathVariable用于接收路径参数,使用{参数名称}描述路径参数
后期开发中:

发送请求参数超过1个时,以json格式为主,@RequestBody应用较广

如果发送非json格式数据,选用@RequestParam接收请求参数

采用RESTful进行开发,当参数数量较少时,例如1个,可以采用@PathVariable接收请求路径变量,通常用于传递id值

SpringBoot复制工程文件夹模板

详见springboot基础篇(4)开头部分

SpringBoot配置文件yml等

默认配置文件application.properties

敲下有提示:比如

server.port=80
#关闭启动banner显示
# spring.main.banner-mode=off
#换成当前文件夹下的其他图片
# spring.banner.image.location=logo.png
# 日志级别 info \debug\error
logging.level.root=info

查询boot配置的网址 

Spring Boot Reference Documentation

springboot的配置文件application.properties是关联pom中的start-web包的,是关联服务器的。所以springboot的每一个配置使用的是它对应的一项技术。

yml

resource新建file起名application.yml,并将原来application.properties删除或移到resource下bak文件夹。

server:port: 81#关闭启动banner显示
spring:main:banner-mode: off#换成当前文件夹下的其他图片banner:image:location: logo.png# 日志级别 info \debug\error
logging:level:root: info

idea有提示 

yaml

resouce下,我们将yml文件扔到bak文件夹中,再创建一个application.yaml

内容同上yml,port改为82. maven clean后重启

如果resource下三种配置共存优先级

三个配置工程优先级properties>yml>yaml

不同配置文件中相同配置按照加载优先级相互覆盖,不同配置文件中不同配置全部保留

只是起冲突的内容才会用到上面优先级。

设置yaml文件idea识别为boot配置(yaml无提示)

右上角项目结构->facets->spring(绿色)选择当前项目点进,点右侧上方菜单最会一个boot配置按钮(customize spring boot按钮),点菜单加号,选择本项目yaml和yml文件即可。

可删除properties文件,如果你创建配置名叫application1111.yml,也可在上述boot配置让其识别为boot配置文件。

yml格式语法规范

yml重数据而轻格式。XML格式明显。

大小写敏感
属性层级关系使用多行描述,每行结尾使用冒号结束
使用缩进表示层级关系,同层级左侧对齐,只允许使用2个空格(不允许使用Tab键)

属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)
#表示注释

yml定义属性和读取属性

# 自定义yml属性
country: 英国
birthday: 2002-11-15
user:name: kdyage: 22
user2:name: 张三age: 22
# 单个数组
fruit:- apple- banana
#  单个数组
fruit2: [apple,banana,pain apple]
#对象数组
userList:- name: zhangsanage: 18- name: lisiage 17
#对象数组
userlist3: [{name:zhangsan,age:18},{name:lisi,age:17}]
#对象数组
userList2:-name: zhangsanage: 18-name: lisiage 17

@Value读取yml中写的属性

@RestController
@RequestMapping("/books")
public class BookController {@Value("${country}")private String country;@Value("${user.name}")private String name;@Value("${fruit[1]}")private String fruit;@Value("${userList[0].name}")private String listName;@GetMappingpublic String getById(){System.out.println("springboot is running...");System.out.println(country);System.out.println(name);System.out.println(fruit);System.out.println(listName);return "springboot is running";}
}

或使用自动装配,封装全部yml属性@Autowired    private Environment env;

@RestController
@RequestMapping("/books")
public class BookController {@Autowiredprivate Environment env;//import org.springframework.core.env.Environment;@GetMappingpublic String getById(){System.out.println(env.getProperty("country"));System.out.println(env.getProperty("user.name"));System.out.println(env.getProperty("fruit[1]"));System.out.println(env.getProperty("userList[0].name"));return "springboot is running";}
}

或封装部分yml属性

datasource:driver: com.mysql.jd.Driverurl: jdbc:mysql://localhost/springboot_dbusername: rootpassword: root123456

 随便找个地方建一个对应的类

@Component//spring接管
@ConfigurationProperties(prefix = "datasource")//yml中的属性名
public class MyDataSource {private String driver;private String url;private String username;private String password;//提供set方法,以便spring自动装配使用public void setDriver(String driver) {this.driver = driver;}public void setUrl(String url) {this.url = url;}public void setUsername(String username) {this.username = username;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "MyDataSource{" +"driver='" + driver + '\'' +", url='" + url + '\'' +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
}

自动装配

@RestController
@RequestMapping("/books")
public class BookController {@Autowiredprivate MyDataSource myDataSource;@GetMappingpublic String getById(){System.out.println(myDataSource);return "springboot is running";}
}

yml属性引用当前yml的其他属性

baseDir: d:\img
tempDir: "${baseDir}\a.txt"  #加上引号,转义为字符串

如果属性中出现特殊字符,可以使用双引号包裹起来作为字符解析。

springboot整合第三方技术

1.junit

springboot项目中pom自带的spring-boot-starter-test集成了junit

可找到结构test目录下自动生成的测试类,@Autowired注入某个bean,就可在方法中调用该bean的方法

@SpringBootTest
class SpringbootBeginQuickstartApplicationTests {@Autowiredprivate BookDaoImpl bookDao;@Testvoid contextLoads() {bookDao.save();}
}

 新建测试类

如果新建测试类在引导类所在的包及其子包下的话,如引导类在mian中Java中的com.kdy,且要新建的测试类在test目录中的java的com.kdy及子包下,这时类上方只需加上@SpringBootTest,可注入,可用@Test测试。

但如果如果新建的测试类不在引导类所在的包及其子包下,注解需要加上引导类字节码

@SpringBootTest(classes = SpringbootBeginQuickstartApplication.class)

2.Mybatis

创建boot项目,除了勾选web下pring Web依赖,也可在勾选SQL里的 mybatis Framewok,和Mysql Driver。不勾选自己加也行,如下:

<!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.3</version></dependency><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency>

 然后,domain写个实体类,可以lombok加上,然后mapper包只需写一个BookMapper的接口。

接口中类上方只需加上一个boot整合muybatis的注解@Mapper即可,然后可用注解的方式写sql,在厕所类中注入后调用测试即可。

@Mapper//用在接口类上,在编译之后会生成相应的接口实现类
public interface BookMapper {@Select("select * from book where id = #{id}")public Book getBookById(@Param("id") Integer id);
}

也可在resource下创建和mapper接口同一个包路径的mapper.xml,复制头文件在里面写sql语句,不用sql注解了。

如果版本问题运行出现时区问题,需在url后加上?serverTimezon=UTC 

3.Mybatis-Plus

创建项目时可用阿里云的镜像

Choose starter service URL:  选择 Custom:  https://start.aliyun.com,先勾选spring web依赖,在勾选关系型数据库mybatisPlus和mysql drver,会引入以下依赖:

		<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version></dependency>

 mapper包只需写一个BookMapper的接口:

@Mapper
public interface BookMapper extends BaseMapper<Book> {
}

无需注解写sql或mapper.xml写sql,mp中有很多增删改查的api ,需要类名和数据表名及相关属性名称对应起来。

也可在yml中配置mp的参数如

mybatis-plus:global-config:db-config:table-prefix: tab_ #如果实体类叫Book,数据表名叫tab_book,可配置这个

4.Druid

阿里巴巴的包手动导包,我们配合mybatis和mysql使用

		<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.1</version></dependency>
spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/jdbcusername: rootpassword: root123type: com.alibaba.druid.pool.DruidDataSource #非整合方式配置duird
spring:datasource:druid: #整合方式配置driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/jdbcusername: rootpassword: root123

运行mybatis的测试即可,测试mybatis接口方法。

总结

导包普通包或starter,配置yml属性,使用、测试、运行

相关文章:

SpringBoot基础认识

创建SpringBoot模块 首先需要引设置maven并引用maven环境 1.打开项目结构&#xff0c;new module&#xff0c;选择Spring Initializr&#xff0c;URL选默认&#xff1a; group填写分组如com.kdy &#xff0c; Artifact起个模块名如springboot_quickstart&#xff0c;Type选择M…...

二十三种设计模式第十九篇--命令模式

命令模式是一种行为设计模式&#xff0c;它将请求封装成一个独立的对象&#xff0c;从而允许您以参数化的方式将客户端代码与具体实现解耦。在命令模式中&#xff0c;命令对象充当调用者和接收者之间的中介。这使您能够根据需要将请求排队、记录请求日志、撤销操作等。 命令模…...

STM32基础入门学习笔记:基础知识和理论 开发环境建立

文件目录&#xff1a; 一&#xff1a;基础知识和理论 1.ARM简介 2.STM32简介 3.STM32命名规范 4.STM32内部功能* 5.STM32接口定义 二&#xff1a;开发环境建立 1.开发板简介 2.ISP程序下载 3.最小系统电路 4.KEIL的安装 5.工程简介与调试流程 6.固件库的安装 7.编…...

Qt应用开发(基础篇)——数值微调输入框QAbstractSpinBox、QSpinBox、QDoubleSpinBox

目录 一、前言 二、QAbstractSpinBox类 1、accelerated 2、acceptableInput 3、alignment 4、buttonSymbols 5、correctionMode 6、frame 7、keyboardTracking 8、readOnly 9、showGroupSeparator 10、specialValueText 11、text 12、wrapping 13、信号 二、Q…...

html | 无js二级菜单

1. 效果图 2. 代码 <meta charset"utf-8"><style> .hiddentitle{display:none;}nav ul{list-style-type: none;background-color: #001f3f;overflow:hidden; /* 父标签加这个&#xff0c;防止有浮动子元素时&#xff0c;该标签失去高度*/margin: 0;padd…...

appium的基本使用

appium的基本使用 一、appium的基本使用appium环境安装1、安装Android SDK 2、安装Appium3、安装手机模拟器4、Pycharm安装 appium-python-alicent5、连接appium和模拟器6、Python代码调用appium软件&#xff0c;appium软件在通过adb命令调用android操作系统&#xff08;模拟器…...

Dockerfile构建nginx镜像(编译安装)

Dockerfile构建nginx镜像 1、建立工作目录 [rootdocker ~]# mkdir nginx [rootdocker ~]# cd nginx/ 2、编写Dockerfile文件 [rootdocker nginx]# vim run.sh [rootdocker nginx]# vim Dockerfile #基于的基础镜像 FROM centos:7#镜像作者信息 MAINTAINER Crushlinux <…...

手机屏幕视窗机器视觉定位软硬件-康耐德

【检测目的】 手机屏幕视窗视觉定位 【效果图片】 【安装示意图】 【硬件配置】...

Databend 开源周报第 104 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 从 Kafka 载入数…...

用于医学图像分类的双引导的扩散网络

文章目录 DiffMIC: Dual-Guidance Diffusion Network for Medical Image Classification摘要本文方法实验结果 DiffMIC: Dual-Guidance Diffusion Network for Medical Image Classification 摘要 近年来&#xff0c;扩散概率模型在生成图像建模中表现出了显著的性能&#xf…...

8.2day03 Redis入门+解决员工模块

概述 在我们日常的Java Web开发中&#xff0c;无不都是使用数据库来进行数据的存储&#xff0c;由于一般的系统任务中通常不会存在高并发的情况&#xff0c;所以这样看起来并没有什么问题&#xff0c;可是一旦涉及大数据量的需求&#xff0c;比如一些商品抢购的情景&#xff0…...

通过案例实战详解elasticsearch自定义打分function_score的使用

前言 elasticsearch给我们提供了很强大的搜索功能&#xff0c;但是有时候仅仅只用相关度打分是不够的&#xff0c;所以elasticsearch给我们提供了自定义打分函数function_score&#xff0c;本文结合简单案例详解function_score的使用方法&#xff0c;关于function-score-query…...

SpringBoot第28讲:SpringBoot集成MySQL - MyBatis-Plus方式

SpringBoot第28讲&#xff1a;SpringBoot集成MySQL - MyBatis-Plus方式 本文是SpringBoot第28讲&#xff0c;MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。MyB…...

AI 绘画Stable Diffusion 研究(三)sd模型种类介绍及安装使用详解

本文使用工具&#xff0c;作者:秋葉aaaki 免责声明: 工具免费提供 无任何盈利目的 大家好&#xff0c;我是风雨无阻。 今天为大家带来的是 AI 绘画Stable Diffusion 研究&#xff08;三&#xff09;sd模型种类介绍及安装使用详解。 目前&#xff0c;AI 绘画Stable Diffusion的…...

Docker 命令没有提示信息

问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; linux安装docker后发现使用docker命令没有提示功能&#xff0c;使用 Tab 键的时候只是提示已有的文件 解决方案&#xff1a; 提示&#xff1a;这里填写该问题的具体解决方案&#xff1a; Bash命令补全 Docke…...

springboot第33集:nacos图

./startup.sh -m standalone Nacos是一个内部微服务组件&#xff0c;需要在可信的内部网络中运行&#xff0c;不可暴露在公网环境&#xff0c;防止带来安全风险。Nacos提供简单的鉴权实现&#xff0c;为防止业务错用的弱鉴权体系&#xff0c;不是防止恶意攻击的强鉴权体系。 鉴…...

学习gRPC(一)

gRPC 简介 根据官网的介绍&#xff0c;gRPC 是开源高性能远程过程调用&#xff08;RPC&#xff09;框架&#xff0c;可以在任何环境中运行。它可以有效地连接数据中心内部和数据中心之间的服务&#xff0c;并为负载平衡、跟踪、运行状况检查和身份验证提供支持。同时由于其建立…...

【二进制安全】堆漏洞:Double Free原理

参考&#xff1a;https://www.anquanke.com/post/id/241598 次要参考&#xff1a;https://xz.aliyun.com/t/6342 malloc_chunk 的源码如下&#xff1a; struct malloc_chunk { INTERNAL_SIZE_T prev_size; /*前一个chunk的大小*/ INTERNAL_SIZE_T size; /*当前chunk的…...

python之open,打开文件时,遇到解码错误处理方式

在Python中&#xff0c;当我们打开一个文件时&#xff0c;我们可以指定文件的编码方式。如果文件的编码方式与我们指定的编码方式不同&#xff0c;那么就会出现解码错误。为了避免这种情况&#xff0c;我们可以使用errors参数来指定如何处理解码错误。 errors参数用于指定解码…...

STM32 CAN通信-CubeMX环境下CAN通信程序的编程与调试经验

文章目录 STM32 CAN通信-CubeMX环境下CAN通信程序的编程 STM32 CAN通信-CubeMX环境下CAN通信程序的编程 STM32F103ZE芯片 CAN通信测试代码&#xff1a; #include "main.h" #include "can.h"CAN_HandleTypeDef hcan1;void SystemClock_Config(void);int ma…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...