前言技术之swagger

news2024/11/30 12:39:27

一.前后端分离的特点

前后端分离是的前端与后端之间的职责更加明确

后台: 负责业务处理

前端: 负责显示逻辑

在这种情况下,前端和后端可以分别交付给专业的开发人员去做,所以是必须要定义前后端直接的对接

接口,否则各自为是则项目无法集成,这时就需要一个文档来定义统一的接口。

二.在没有swagger之前

在没有swagger之间,我们可以使用word,excel等功能来书写接口定义文档,但又有一个弊端,即:

在接口发送改变时需要及时的同步接口文档,否则实际的接口与接口文档不相符,则接口文件就失去了

作用,甚至会起到反作用。

三.swagger的作用

根据在代码中使用自定义的注解来生成接口文档,这个在前后端分离的项目中很重要。这样做的好处是

在开发接口时可以通过swagger将接口文档定义好,同时也方便以后的维护。

四.swagger的优点

号称时最流行的API框架

接口文档在线生成,避免同步的麻烦

可以支持在线对接口执行测试

支持多语言

五.集成swagger

5.1 新建springboot项目

使用集成开发工具创建一个springboot工程

5.2 集成swagger

1.pom.xml

<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>swagger</artifactId>
<version>2.9.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>

2.编写swagger配置类

package com.ycx.swagger.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;


@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket createRestApi(){
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
                .paths(PathSelectors.ant("/**")) //项目名
                .build();

    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("SwaggerDemoAPIDOC")
                .description("SwaggerDemoAPIDOC")
                .version("1.0")
                .termsOfServiceUrl("https://www.baidu.com").build();
    }
}

注意:SpringBoot与swagger2的版本对应关系,否则项目是启动不成功的,这里的版本对应关系如下

5.3 开发一个controller用于测试

package com.ycx.swagger.web;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;


//@Api(tags = {"这是swagger入门类","作用2"})
@Api(tags = "这是swagger入门类")
@RestController
@RequestMapping("/swagger")
public class HelloController {
//    @ApiOperation(value = "", tags = "swagger入门方法")
    @ApiOperation(value = "swagger入门方法")
    @GetMapping("/hello")
    public Map<String,Object> hello(){
        Map<String,Object> map = new HashMap<>();
        map.put("code",200);
        map.put("msg","响应成功!!!");
        return map;
    }
}

5.4 启动服务,验证集成效果

服务启动后,访问:http://localhost:8080/swagger-ui.html

说明集成成功

6.swagger常用注解


注解

位置

作用

参数

@Api

标识这个类是swagger的资源

tags:说明该类的作用,参数是个数组,可 以填多个。

value="该参数没什么意义,在UI界面上不显示,所以不用配置"

description = "用户基本信息操作"

@ApiOperation

方法

表示一个http请求的操作

value="方法的用途和作用"

notes="方法的注意事项和备注"

tags:说明该方法的作用,参数是个数组,可以填多 个。

格式:tags={"作用1","作用2"}

@ApiParam

方法,参数

对参数使用说明(如:说明 或是否必填等)

value="用户名" 描述参数的意义

name="name" 参数的变量名

required=true 参数是否必选

@ApiModel

表示对类进行说明,用于参 数用实体类接收,一般用在 DTO上

description="描述实体的作用"

@ApiModelProperty

方法,字段

表示对model属性的说明

value="用户名" 描述参 数的意义

name="name" 参数的变量名

required=true 参数是否必选

@ApiIgnore

类,方法,参数

表示这个方法或者类被忽略

@ApiImplicitParams

方法

包含多@ApiImplicitParam

@ApiImplicitParam

方法

表示单独的请求参数

name="参数名称"

value="参数说明"

dataType="数据类型"

paramType="query" 表示参数放在哪里

defaultValue="参数的默认值"

required="true" 表示参数是否必须传

paramType="query"的解释如下

header 请求参数的获取:@RequestHeader

query 请求参数的获取:@RequestParam

path(用于restful接口) 请求参数的获取:@PathVariable

body(不常用)

form(不常用)

更全面的信息可以参考官方说明文档:

https://docs.swagger.io/swagger-core/apidocs/index.html

    • swagger使用综合案例

package com.ycx.swagger.web;

import com.ycx.swagger.dto.User;
import io.swagger.annotations.*;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;


@RestController
@RequestMapping("/swagger/api")
@Api(tags = "swagger所有注解的讲解")
public class SwaggerController {


    @ApiOperation(value = "欢迎信息")
    @GetMapping("/hello")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "name", value = "名称", dataType = "string", paramType = "query", required = true),
            @ApiImplicitParam(name = "msg", value="消息", dataType = "string", paramType = "query", required = true)
    })
    public Object hello(String name, String msg) {
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);
        map.put("msg", "操作成功");
        map.put("info",name+":"+msg);
        return map;
    }

    @PostMapping("/register")
    @ApiOperation("注册用户接口")
    @ApiResponses({
            @ApiResponse(code = 5001001,message = "错误1"),
            @ApiResponse(code = 5001002,message = "错误2"),
            @ApiResponse(code = 5001003,message = "错误3")
    })
    public Object register(User user) {
        Map<String, Object> map = new HashMap<>();
        map.put("code", 5001002);
        map.put("msg", "操作成功");
        map.put("info",user);
        return map;
    }

    @PutMapping("/edit")
    @ApiOperation("修改用户信息")
    public Object edit(@RequestBody User user) {
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);
        map.put("msg", "操作成功");
        map.put("info",user);
        return map;
    }

    @DeleteMapping("/delete/{id}")
    @ApiOperation("删除用户")
    @ApiImplicitParam(name = "id", value="用户ID", dataType = "string", paramType = "path", required = true)
    public Object delete(@PathVariable("id") String id) {
        Map<String, Object> map = new HashMap<>();
        map.put("code", 200);
        map.put("msg", "操作成功");
        map.put("info",id);
        return map;
    }
}

package com.ycx.swagger.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
@ApiModel(description = "用户信息")
public class User {

    @ApiModelProperty(value = "用户名", name="name", required = true)
    private String name;

    @ApiModelProperty(value = "密码", name="passwd", required = true)
    private String passwd;

}

    • 会议OA之swagger

  1. 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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.7</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.ycx</groupId>
    <artifactId>minoa</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>minoa</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <fastjson.version>1.2.70</fastjson.version>
        <jackson.version>2.9.8</jackson.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.1</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.44</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.2</version>
                <dependencies>
                    <!--使用Mybatis-generator插件不能使用太高版本的mysql驱动 -->
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>${mysql.version}</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <overwrite>true</overwrite>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

2.swagger的整合配置类

package com.ycx.minoa.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;


@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket createRestApi(){
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
                .paths(PathSelectors.ant("/**")) //项目名
                .build();

    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("SwaggerDemoAPIDOC")
                .description("SwaggerDemoAPIDOC")
                .version("1.0")
                .termsOfServiceUrl("https://www.baidu.com").build();
    }
}

注意:此时SpringBoot (2.7.7) 版本与swagger2 (2.9.2) 的版本不兼容,需要添加application.yml相关配置

3.application.yml

spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher

4.web层接口服务提供

package com.ycx.minoa.wxcontroller;

import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Api(tags = "会议OA接口开发测试")
@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello(){
        return "hello";
    }
}
@Api(tags = "会议OA小程序接口列表")
@RestController
@RequestMapping("/wx/home")
public class WxHomeController {
    @Autowired
    private InfoMapper infoMapper;

    @ApiOperation("会议OA首页数据加载")
    @GetMapping("/index")
    public Object index(@RequestBody Info info) {
        List<Info> infoList = infoMapper.list(info);
        Map<Object, Object> data = new HashMap<Object, Object>();
        data.put("infoList",infoList);
        return ResponseUtil.ok(data);
    }
}

package com.ycx.minoa.model;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

import java.util.Date;

@ApiModel(description = "会议信息")
public class Info {
    @ApiModelProperty(value = "会议ID", name="id", required = false)
    private Long id;

    @ApiModelProperty(value = "会议标题", name="title", required = false)
    private String title;

    @ApiModelProperty(value = "会议内容", name="content", required = false)
    private String content;

    @ApiModelProperty(value = "参与者", name="canyuze", required = false)
    private String canyuze;

    @ApiModelProperty(value = "列席人员", name="liexize", required = false)
    private String liexize;

    @ApiModelProperty(value = "主持人", name="zhuchiren", required = false)
    private String zhuchiren;

    @ApiModelProperty(value = "会议地点", name="location", required = false)
    private String location;

    @ApiModelProperty(value = "会议开始时间", name="starttime", required = false)
    private Date starttime;

    @ApiModelProperty(value = "会议结束时间", name="endtime", required = false)
    private Date endtime;

    @ApiModelProperty(value = "附件", name="fujian", required = false)
    private String fujian;

    @ApiModelProperty(value = "会议状态", name="state", required = false)
    private Integer state;

    @ApiModelProperty(value = "审批人", name="auditperson", required = false)
    private String auditperson;

    @ApiModelProperty(value = "审批时间", name="audittime", required = false)
    private Date audittime;

    @ApiModelProperty(value = "会议座位图片", name="seatpic", required = false)
    private String seatpic;

    @ApiModelProperty(value = "备注", name="remark", required = false)
    private String remark;

    public Info(Long id, String title, String content, String canyuze, String liexize, String zhuchiren, String location, Date starttime, Date endtime, String fujian, Integer state, String auditperson, Date audittime, String seatpic, String remark) {
        this.id = id;
        this.title = title;
        this.content = content;
        this.canyuze = canyuze;
        this.liexize = liexize;
        this.zhuchiren = zhuchiren;
        this.location = location;
        this.starttime = starttime;
        this.endtime = endtime;
        this.fujian = fujian;
        this.state = state;
        this.auditperson = auditperson;
        this.audittime = audittime;
        this.seatpic = seatpic;
        this.remark = remark;
    }

    public Info() {
        super();
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getCanyuze() {
        return canyuze;
    }

    public void setCanyuze(String canyuze) {
        this.canyuze = canyuze;
    }

    public String getLiexize() {
        return liexize;
    }

    public void setLiexize(String liexize) {
        this.liexize = liexize;
    }

    public String getZhuchiren() {
        return zhuchiren;
    }

    public void setZhuchiren(String zhuchiren) {
        this.zhuchiren = zhuchiren;
    }

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }

    public Date getStarttime() {
        return starttime;
    }

    public void setStarttime(Date starttime) {
        this.starttime = starttime;
    }

    public Date getEndtime() {
        return endtime;
    }

    public void setEndtime(Date endtime) {
        this.endtime = endtime;
    }

    public String getFujian() {
        return fujian;
    }

    public void setFujian(String fujian) {
        this.fujian = fujian;
    }

    public Integer getState() {
        return state;
    }

    public void setState(Integer state) {
        this.state = state;
    }

    public String getAuditperson() {
        return auditperson;
    }

    public void setAuditperson(String auditperson) {
        this.auditperson = auditperson;
    }

    public Date getAudittime() {
        return audittime;
    }

    public void setAudittime(Date audittime) {
        this.audittime = audittime;
    }

    public String getSeatpic() {
        return seatpic;
    }

    public void setSeatpic(String seatpic) {
        this.seatpic = seatpic;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }
}

5.测试结果

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

liblas读取点云,设置半透明

一&#xff0c;用Liblas读取点云数据&#xff0c;获取点云位置和颜色 二&#xff0c;将点云位置和颜色分别代入geode的位置数组和颜色数组 三&#xff0c;用glsl设置半透明。需要注意的是 1&#xff0c;颜色数组是用attribute,所以要用 geom->setVertexAttribArray(10, colo…

Wireshark抓包分析DHCP

1、DHCP简介动态主机设置协议&#xff08;英语&#xff1a;Dynamic Host Configuration Protocol&#xff0c;DHCP&#xff09;是一个局域网的网络协议&#xff0c;使用UDP协议工作&#xff0c;主要有两个用途&#xff1a;用于内部网或网络服务供应商自动分配IP地址&#xff1b…

从0到1完成一个Vue后台管理项目(十五、作业列表、表格数据方法的封装)

往期 从0到1完成一个Vue后台管理项目&#xff08;一、创建项目&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;二、使用element-ui&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;三、使用SCSS/LESS&#xff0c;安装图标库&#xff09; 从0到1完成一个Vu…

解决虚拟机安装 VMware Tools 灰色无法点击问题

环境&#xff1a; 主机 OS: Windows 11 虚拟机平台: VMware Workstation 17 Pro 虚拟系统: Ubuntu 22.04 1. 问题 安装好 Linux 系统后&#xff0c;想要适配桌面大小等其它功能就需要安装 VMware Tools 这个工具&#xff0c;最简单的办法就是通过虚拟机平台的 “一键安装”&a…

Java之ATM系统

目录项目介绍系统准备&#xff0c;首页设计总结开户功能总结用户登录总结用户操作页设计、查询账户、退出账户功能用户存钱取款功能转账功能密码修改、销户源代码项目介绍 系统准备&#xff0c;首页设计 总结 1、用户的账户信息&#xff0c;系统如何表示的? 定义账户类Accoun…

【CVHub】现代目标检测故事 | 40+目标检测网络架构大盘点!从基础架构ResNet到最强检测器Yolov7再到最新部署神器GhostNetV2

本文来源“CVHub”公众号&#xff0c;侵权删&#xff0c;干货满满。 作者丨派派星 来源丨CVHub 原文链接&#xff1a;现代目标检测故事 | 40种网络架构大盘点&#xff01;从基础架构ResNet到最强检测器Yolov7再到最新部署神器GhostNetV2 导读 目标检测是指在图像或视频中分…

PHY6230 高性价比低功耗高性能 集成32-bit MCU BLE5.2+2.4G芯片

PHY6230 是一款高性价比低功耗高性能Bluetooth LE 5.2系统级芯片&#xff0c;集成32-bit高性能低功耗MCU&#xff0c;16KB OTP&#xff0c;8KB Retention SRAM和64KB ROM&#xff0c;可选EEPROM。内置高性能多模射频收发机最大发射功率10dBm&#xff0c;BLE 1Mbps速率下接收灵敏…

快手发布2022直播生态报告,运营人速览

1、快手电商推出2023年直播间联合补贴活动1月5日&#xff0c;快手电商推出2023年直播间联合补贴活动。该活动主要目的是助力主播完成更高销售额&#xff0c;报名成功后&#xff0c;平台将对直播间内的一部分活跃用户发放10%-16%折扣率的满减优惠券&#xff0c;成本由平台和主播…

【BUG解决方案】jQuery数组中包含数据,但通过 .length 获得的数组长度始终为0

0. BUG展示 var lels []; for (var i 0; i < maxDevNums 1; i) {lels.push([]); } $.ajax({type : "post",async : true,url : "/sc/comb/history/data",data : {},dataType : "json",success : function (result) {if (result) {for (le…

FFmpeg 集成 x265 编译及解码

x265 是一个免费的软件库和应用程序&#xff0c;用于将视频流编码为 H.265/MPEG-H HEVC 压缩格式&#xff0c;并在 GNU GPL 条款下发布。 FFmpeg 为了支持 H.265 编、解码可以集成 x265 编译&#xff0c;在编译 FFmpeg 之前需要先编译 x265&#xff0c;但并不是所有的版本都能…

Python一轮知识拾遗

目录 字符串格式化 %格式符 format字符串格式化 三元条件运算符 可迭代对象 break和continue语句 enumerate函数 序列封包 序列解包 部分序列解包 append.列表和extend.列表的区别 字符串格式化 通过字符串的格式化&#xff0c;可以输出特定格式的字符串。 (1) 格式化…

为什么要申报绿色工厂?

一、什么是绿色工厂&#xff1f; 绿色工厂是指实现了用地集约化、生产洁净化、废物资源化、能源低碳化的工厂。 二、为什么要申报绿色工厂&#xff1f; 1、政策导向&#xff0c;发展趋势 发展绿色工厂是顺应全球绿色发展的大趋势&#xff0c;符合国家政策导向。 2、荣誉称号…

[笔记]Windows Cyswin ssh配置及远程控制

文章目录前言一、配置1.1 安装 Cygwin1.2 Cygwin安装时搜索安装ssh1.3 添加cygwin安装目录至Path环境变量1.4 配置 SSHD 服务1.5 添加 sshd连接账号二、使用2.1 使用配置的连接账号进行登录2.2 连接远程主机三、常见问题3.1 ssh on cygwin和openssh 冲突 提示 Host key verific…

新增血缘关系功能,色彩地图支持标记功能,DataEase开源数据可视化分析平台v1.18.0发布

2023年1月9日&#xff0c;DataEase开源数据可视化分析平台正式发布v1.18.0版本。 这一版本的功能升级包括&#xff1a;数据集方面&#xff0c;定时任务采用分页的方式拉取数据&#xff0c;减少资源消耗&#xff1b;仪表板方面&#xff0c;新增仪表板主题&#xff0c;以满足不同…

二叉平衡树之二叉树搜索树【咱们一起手动模拟实现】

目录 1、什么是二叉搜索树&#xff1f; 2、手动模拟二叉搜索树 2.1、整体代码 2.2、查找数据 2.3、插入数据 2.4、删除数据 3、性能分析 1、什么是二叉搜索树&#xff1f; 二叉搜索树也叫作二叉排序树&#xff0c;可以使一颗空树&#xff0c;也可以是具有以下性质的二…

JavaScript 高级 内存管理和闭包

这里写目录标题1. JavaScript内存管理2. 垃圾回收机制算法1. 引用计数算法2. 标记清除算法3. 闭包的概念理解4. 内存泄露5. 面试题1. JavaScript内存管理 不管什么样的编程语言&#xff0c;在代码的执行过程中都是需要给它分配内存的&#xff0c;不同的是某些编程语言需要我们…

基于融合C3SE+YOLOv5s的高精度二维码检测识别分析系统

在前面的系列博文中&#xff0c;我们尝试了在不同款的yolov5模型中加入不同的注意力机制来提升模型的性能&#xff0c;都有不错的表现效果&#xff0c;本文主要的目的是尝试将注意力机制融合集成进入原生的C3模块中来替换原生的C3模块来对比分析模型的检测性能&#xff0c;首先…

【精华】JVM调优学习

JVM 介绍 1. 什么是 JVM JVM 是 Java Virtual Machine&#xff08;Java 虚拟机&#xff09;的缩写。一台执行 Java 程序的机器。 2 .JAVA 语言的执行原理 计算机语言&#xff1a; 计算机能够直接执行的指令。这种指令和系统及硬件有关。 计算机高级语言&#xff1a; 在遵循…

模块化建筑全球市场分析

模块化市场分析 市场摘要 全球模块化建筑市场&#xff0c;预计从2019年的1199亿6千万美元&#xff0c;到2027年的1916亿2千万&#xff0c;以6.4%的年复合成长率成长。人口增加&#xff0c;快速城市化和基础设施发展投资增加是预测期内刺激市场增长的关键因素。模块化施工是最可…

【C进阶】第十三篇——指针详解

指针的基本概念 指针类型的参数和返回值 指针与数组 指针与const限定符 指针与结构体 指向指针的指针与指针数组 指向数组的指针与多维数组 函数类型和函数指针类型 不完全类型和复杂声明 指针的基本概念 堆栈有栈顶指针&#xff0c;队列有头指针和尾指针&#xff0c;…