《springboot使用篇》——只为使用,一篇就够

news2024/11/25 22:54:38

目录

环境:

spring boot概述

一,springboot快速入门

1.创建maven项目

2.引入起步依赖 

3.自定义controller

4.编写启动类 

5.开始测试 

二.快捷方式创建sprinboot工程

 补充

 三,配置文件

1.配置文件之间的关系

 2.yml配置文件

1.基本语法

 2.具体实现

3.读取配置文件的三种方式 

1.首先通过@Value注解来注入

 2.通过Environment注入

 3.通过@ConfigurationPropertis

四.profile

1.简介

2.profile配置方式

1.多profile文件配置

2.yml多文档方式

3.profile的激活方式

1.虚拟机参数

2.命令行激活

 五,内部配置文件的加载顺序

 六,命令行指定参数运行

 七,springboot整合其他框架

1.整合junit

 2.整合redis

1.实现步骤

2.引入redis起步依赖

3.进行测试

4,改变连接redis的位置 

3.整合Mybatis

1.步骤

2.创建工程,引入起步依赖

 3.编写配置文件

最后


环境:

1.idea2021

2.java8

3.springboot 2.6.13

spring boot概述

Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。

Spring Boot 基于Spring开发,Spring Boot 本身并不提供Spring 框架的核心特性以及扩展功能,只是用于快速.敏捷的开发新一代基于Spring 框架的应用程序。 Spring Boot以约定大于配置的核心思想,默认帮我们进行了很多设置,多数Spring Boot应用只需要很少的Spring配置,几乎可以零配置开箱即用。
 

一,springboot快速入门

1.创建maven项目

选择使用maven创建项目,直接下一步,然后对工程命名后直接点击完成。

2.引入起步依赖 

    <!--springboot工程需要继承的父工程-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
    </parent>

    <dependencies>
        <!--web开发的起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

3.自定义controller

随便定义一个controller ,用于测试。

controller层,这里值得提一嘴的就是@Controller和@RestController注解的区别。@Controller控制器,处理http请求。@RestController注解相当于@ResponseBody+@Controller合在一起的作用,RestController使用的效果是将方法返回的对象直接在浏览器上展示成json格式.

package com.itheima.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String hello(){
        return " hello Spring Boot !";
    }
}

4.编写启动类 

启动类是springboot项目的入口。我们习惯都是以Apllication结尾。

@SpringBootApplication
public class HelloApplication {

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

5.开始测试 

我们点击启动类,启动项目,然后就可以在浏览器地址访问到。

这个端口号我们可以在运行之后的命令行看到

补充:其实idea提供了一种更简便的方式创建springboot项目,这个我们在下面会讲到。

二.快捷方式创建sprinboot工程

首先选择Spring Initalizr,然后选择服务器,这里默认是一个start.spring.io的这么一个网址,但是我们一看就知道这是一个外国的网址,因为我们在中国的所见到的一级域名一般是.cn或者.com,(不多讲,这里也不重要)所以,我们可以使用国内的服务器,在国内,阿里云就提供了,相同的服务,网址:start.aliyun.com,所以,我们就将服务网址换为start.aliyun.com。然后写上项目名称,就可以点击下一步了。

注意:在这里我们为什么要选择网址呢?其实是因为创建springboot工程需要联网下载相关的模块(网上还有不用联网的方法,由于没试过,就不好说了)

下一步,添加依赖,在这里我们可以选一个Mysql的驱动,然后再选一个web的spring web依赖,假如,有些依赖我们忘记添加了怎么办?对!我们可以自己之后在pom.xml文件中添加。

 然后,我们可以看到,在springbootinit目录下有我们的启动类用于起步依赖、自动配置。我们在springbootinit下面创建一个HelloController类用于测试。

package com.itheima.springbootinit;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {


    @RequestMapping("/hello")
    public String hello() {
        return "hello Spring Boot 222!";
    }
}

 补充

但是其实在正式开发的环境中,我们会在和启动类的同目录下创建controller,dao,service包,然后在controller包下面创建类LoginController,如下图。

注意:启动类要和controller,dao,service包在同一目录下,因为启动类会默认自动扫描和自己同一目录下的包。

开始测试,点击启动类启动springboot项目。

 三,配置文件

1.配置文件之间的关系

在springboot项目中我们可以通过以下两种配置文件去修改springboot的默认配置。但我们存在多个配置文件的时候,我们会优先使用优先级高的配置文件,里面的配置信息,但是如果低级别的文件配置的信息,在高级的配置文件里面没有定义,那么springboot还是会读取到低级别的配置文件信息,其实也就是说,springboot会读取所有的配置,不管是什么级别的配置文件。

比如说在properties配置文件中:

server.port=8089

而在yml配置文件中:

person:
  name: zhangsan
  age: 20
  address:
  - beijing
  - shanghai

server:
  port: 8082

那么,springboot就会采取properties配置文件中的port信息,但是由于在properties配置文件中没有定义person信息,所以,springboot会采用yml的person信息。 

 2.yml配置文件

1.基本语法

 2.具体实现

#参数引用
name: nihao
#对象
person:
  name: ${name}
#  name: zhangsan
  age: 20
#对象行内写法
person2: {name: zhansang,age :20}
#数组
address:
  - beijing
  - shanghai
#数组行内写法
address1: [beijing,shanghai]

#纯量
msg1: 'hello \n world' #不会识别转义字符
msg2: 'hello \\n world' #会识别转义字符

server:
  port: 8082

3.读取配置文件的三种方式 

1.首先通过@Value注解来注入

    @Value("${name}")
    private String name;

    @Value("${person.name}")
    private String name2;
    //注意对象和基本数据类型的注入方式的不同

 2.通过Environment注入

首先定义一个Environment对象在类中,并且加上@Autwired注解,这样的话,springboot就会在项目初始化时就注入Environment对象。

    @Autowired
    private Environment env;

通过,.getProperty()方法去调用配置文件的值。 

        System.out.println(env.getProperty("person.name"));
        System.out.println(env.getProperty("address[0]"));

 3.通过@ConfigurationPropertis

如下图:但是其实这里的prefix = "person"不加也没有关系,至少不会报错,只是他获取的就是,person之外的数据,而不是从我们在propertis配置定义的person获取数据,即:不从

person:
  name: ${name}
#  name: zhangsan
  age: 20

中获取数据。而是从配置文件person数据之外的地方获取数据。 

四.profile

1.简介

2.profile配置方式

1.多profile文件配置

首先我们先创建一下配置文件,application-dev.propertis(生产环境),application-pro.propertis(开发环境),application-test.propertis(测试环境)。这里先不用创建yml文件。

然后我们在各个配置文件中指定环境,比如说test.properties就是使用的8082,而pro.properties

使用的是8083,dev.properties就是8081

 然后我们在application.properties配置文件中激活生产环境,如果都不激活,那么还是使用默认的生产环境8080.现在我们激活dev

spring.profiles.active=dev
#spring.profiles.active=pro
#spring.profiles.active=test

 

可以看到激活成功。 

2.yml多文档方式

---

server:
  port: 8081

spring:
  profiles: dev
---

server:
  port: 8082

spring:
  profiles: test
---
server:
  port: 8083

spring:
  profiles: pro
---
#激活配置
spring:
  profiles:
    active: dev

比如说现在我使用test,运行发现激活成功

3.profile的激活方式

1.虚拟机参数

右键,选择编辑配置。

1. 我们在虚拟机选项上,写入-Dspring.profiles.active=test,注意先不要写下面的程序参数配置。之后我们会发现test配置文件生效。

 2.如上图,我们在程序参数的配置文件上写入--spring.profiles.active=pro(不要和上面的虚拟机参数同时写),然后我们启动,可以发现pro配置文件被激活。

2.命令行激活

在我们真实的测试和上线部署的时候,没有idea这样的图形化工具,那么我们就需要通过命令行的方式去激活配置文件,但是前提是我们先要将springboot项目打包成一个jar包。

1.打jar包

选择我们的项目,然后开始打包,点击package。

插曲:在这里我打jar包的时候出现了报错  Unable to find main class

解决方法是在插件中<artifactId>spring-boot-maven-plugin</artifactId>,添加如下配置,其实就是添加了启动类,因为那个报错的意思就是没有找到启动类。

        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>com.itheima.springbootprofiles.SpringbootProfilesApplication</mainClass>
                </configuration>
            </plugin>
        </plugins>

2,打包成功

 可以看到在当前模块的target目录下有我们打的jar包

然后我们按住shift+右键 ,点击powershell文件,然后输入 java -jar .\springboot-profiles-0.0.1-SNAPSHOT.jar,回车后运行成功。(注意这里先停掉idea里面的项目,不然的话可能会出现端口占用的问题)

3. 在命令行输入激活指令

输入java -jar .\springboot-profiles-0.0.1-SNAPSHOT.jar --spring.profiles.active=pro

如下图,我们可以看到pro的配置生效了。

 五,内部配置文件的加载顺序

这个file就是你的项目,classpath可以理解为未打包前的项目里的Java和resource部分合在一起。比如说现在我们创建如下模块springboot-config,然后在添加如下配置。如下图,可以看到file下有一个properties配置文件,那么他的优先级是第二file下面还有一个config文件夹,文件夹里的properties配置文件优先级是第一然后resource下面的config文件夹里的配置文件优先级就是第三resource下的配置文件优先级就是第四。

但是值得注意的是,因为file:配置文件和file:/config/配置文件是不会被打进jar里面的。所以在项目打包成jar包之后,先起作用的还是resource/config目录下的配置文件 ,其次在是resource下的配置文件

 六,命令行指定参数运行

如下图输入java -jar .\springboot-profiles-0.0.1-SNAPSHOT.jar --server.port=9090,--server.port=9090就是我们临时指定的参数。

 七,springboot整合其他框架

1.整合junit

1.首先创建工程,

创建如下图的类。 

Userservice

package com.itheima.springboottest;

import org.springframework.stereotype.Service;

@Service
public class UserService {


    public void add() {
        System.out.println("add...");
    }
}

UserServiceTest

package com.itheima.test;

import com.itheima.springboottest.SpringbootTestApplication;
import com.itheima.springboottest.UserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * userService的测试类
 */

@RunWith(SpringRunner.class)
//当测试包和启动类在同一包下,下面的注解是不需要指定的
@SpringBootTest(classes = SpringbootTestApplication.class)
public class UserServiceTest {

    @Autowired
    private UserService userService;
    //注意,要对测试方法加上@Test注解
    @Test
    public void testAdd() {
        userService.add();
    }
}

 当测试包和启动类在同一包下,下面的注解是不需要指定的,比如说,我把测试类和启动类放在同一包下,那么就可以不加@SpringBootTest(classes = SpringbootTestApplication.class)这一注解。

之后的测试方法

package com.itheima.springboottest;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * userService的测试类
 */

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTest {

    @Autowired
    private UserService userService;

    @Test
    public void testAdd() {
        userService.add();
    }
}

 注意:junit5之后@RunWith注解也不需要加了

点击测试方法, 运行成功

 2.整合redis

1.实现步骤

2.引入redis起步依赖

我们可以在创建工程的时候就直接引入redis,选择NoSQL,选择第一个

创建完成后,我们可以在pom文件中看到redis的依赖

3.进行测试

目录结构如下

创建测试类SpringbootRedisApplicationTest

package com.itheima.springbootredis;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.BoundValueOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootRedisApplicationTests {
    //注入redis
    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void testSet() {
        //存入数据
        redisTemplate.boundValueOps("name").set("zhangsan");
    }

    @Test
    public void testGet() {
        //获取数据
        Object name = redisTemplate.boundValueOps("name").get();
        System.out.println(name);
    }

}

默认springboot会在你本机没有启动redis或者没有redis服务的情况下,提供一个redis,但是如果你的本机存在redis而且redis服务已经开启,那么就会采用本机的redis进行存取数据,比如说我这里就已经在本机上启动来redis。

我们可以看到,连接还是正常的。

4,改变连接redis的位置 

我们可以创建配置文件去指定我们连接redis的位置

spring:
  redis:
    host: 127.0.0.1 # redis的主机ip
    port: 6379

这样的话,我们就可以连接不同的redis服务。 

3.整合Mybatis

1.步骤

2.创建工程,引入起步依赖

 3.编写配置文件

配置yml文件

# datasource
spring:
  datasource:
    url: jdbc:mysql:///springboot?serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver


# mybatis,如果你是基于注解开发的,那么下面的配置是不用加的
mybatis:
  mapper-locations: classpath:mapper/*Mapper.xml # mapper映射文件路径
  type-aliases-package: com.itheima.springbootmybatis.domain

  # config-location:  # 指定mybatis的核心配置文件

那么什么是基于注解开发,就是没有mapper.xml,我就不多解释了,就给一段代码你们自己体会吧!

UserMapper接口

package com.itheima.springbootmybatis.mapper;

import com.itheima.springbootmybatis.domain.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

import java.util.List;

@Mapper
@Repository
public interface UserMapper {

    @Select("select * from t_user")
    public List<User> findAll();
}

 假设你不是基于全注解开发,那么就需要xml文件。

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.springbootmybatis.mapper.UserXmlMapper">
    <select id="findAll" resultType="user">
        select * from t_user
    </select>
</mapper>

 那么我们就需要在yml配置文件中去配置我们的Mapper信息。

# datasource
spring:
  datasource:
    url: jdbc:mysql:///springboot?serverTimezone=UTC
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver


# mybatis
mybatis:
  mapper-locations: classpath:mapper/*Mapper.xml # mapper映射文件路径
  type-aliases-package: com.itheima.springbootmybatis.domain

  # config-location:  # 指定mybatis的核心配置文件

最后

本篇博客对springboot的使用就介绍搭配这里了,如果本篇博客对你有帮助的话,请点一个小赞支持一下,感谢!我们下篇博客再见!

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

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

相关文章

【ROS】ROS+Gazebo强化学习:训练

1、安装ROS1 【ROS】Ubuntu20.04安装ROS1 2、安装Anaconda 【AI】PyTorch入门&#xff08;一&#xff09;&#xff1a;通过Anaconda安装PyTorch 【PyThon】Anaconda常用命令 3、源码下载 使用论文 Goal-Driven Autonomous Exploration Through Deep Reinforcement Learnin…

VMware虚拟机安装win10系统教程

执行本教程前请依次阅读以下2篇文章&#xff0c;完成环境准备&#xff1a; 1.VMware虚拟机下载安装教程【详细步骤 - 图文结合】 VMware虚拟机下载安装教程【详细步骤 - 图文结合】_西晋的no1的博客-CSDN博客 2.如何在微软官网下载win10镜像文件 如何在微软官网下载win10镜像文…

IDEA中Node.js环境下npm报错Error:0308010C:digital envelope routines:unsupported

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 是一个开源的、跨平台的 JavaScript 运行时环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型&#xff0c;使其轻量又高效。Node.js 的包管理器 npm,是目前最流行的Node.js 的包管理器。 一、安装nod…

快速幂(简单 C++)

快速幂&#xff1a;就是能够快速地计算出以 a 为底数&#xff0c;b 为指数的幂&#xff0c;相较于传统的求幂算法&#xff0c;当指数 b 非常大时&#xff0c;使用快速幂算法&#xff0c;可以大大地降低循环的次数。 以3 ^ 13 为例&#xff1a; 首先将 b 转换成二进制&#xff…

Kubernetes配置Jenkins Slave

Kubernetes配置Jenkins Slave 部署在kubernetes集群内 1、部署jenkins 1.1、命名空间 apiVersion: v1 kind: Namespace metadata:name: jenkinscilabels:app: jenkinsci1.2、Deployment apiVersion: apps/v1 kind: Deployment metadata:name: jenkinscinamespace: jenkinsci…

软考A计划-系统架构师-案例分析考前背诵-上篇

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

〖数据结构〗一棵有点自律的树——搜索二叉树

文章目录 &#x1f490;专栏导读&#x1f490;文章导读&#x1f337;搜索二叉树概念&#x1f337;二叉搜索树的构建&#x1f33a;查找操作&#x1f33a;插入操作&#x1f33a;删除操作&#x1f33a;遍历操作☘️测试 &#x1f3f5;️拓展——递归实现&#x1f343;递归查找&…

MATLAB与物联网:如何应用MATLAB进行物联网数据的处理和分析

第一章&#xff1a;引言 物联网&#xff08;Internet of Things, IoT&#xff09;作为当今科技领域的热门话题&#xff0c;正在改变我们的生活方式和工作方式。随着物联网设备的普及和数据的不断增长&#xff0c;如何高效地处理和分析物联网数据成为了一个重要的挑战。MATLAB作…

【C语言之操作符1】

C语言之操作符1 1. 操作符分类2. 算术操作符3. 移位操作符3.1 左移操作符3.2 右移操作符 4. 位操作符5. 赋值操作符 1. 操作符分类 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用、函数调用和结构成员 2. 算术…

【哈佛积极心理学笔记】第14讲 过犹不及

第14讲 过犹不及 Recap: Stress is not the problem. The problem is lack of revovery. level of stress -> chronic stress -> chronic anxiety -> depression Recovery on different level: micro level 15 min break, lunch timemezzo level, full night slee…

1.Apollo开发部署-linux

一.官方文档 https://www.apolloconfig.com/#/zh/deployment/quick-start-docker 二.环境准备 1.MySql 5.6.51.单独服务器192.168.2.13 https://downloads.mysql.com/archives/installer/ 2.JDK 1.8.X https://www.oracle.com/java/technologies/downloads/ 三.Apollo部署…

【JVM篇】垃圾回收算法

目录 1、前言 2、标记-清除算法 3、标记-整理算法 4、标记-复制算法 5、总结 1、前言 说起垃圾回收&#xff08;Garbage Collection&#xff09;&#xff08;本文简称GC&#xff09;。相信同时对C和Java有了解的小伙伴都知道&#xff0c;C在new完对象后&#xff0c;是需要…

【Linux】发展史浅谈

为什么要学Linux&#xff1f; LInux和微软的Windows在定位上都是一样的&#xff0c;即操作系统。而且LInux是一款雄霸服务端的操作系统&#xff0c;是在企业端被高频使用的后台操作系统。 科技发展的基本模式 所有的技术进步&#xff0c;本质都是为了促进更好的工具的发明&a…

【Python ORM】零基础也能轻松掌握的学习路线与参考资料

Python orm&#xff08;Object-Relational Mapping&#xff09;是一种模式&#xff0c;它将对象和关系型数据库之间的映射相互转换&#xff0c;使得应用程序可以通过面向对象的方式来操作数据库。Python orm 在开发大型 Web 应用程序中特别有用&#xff0c;使得与数据库的交互变…

【IMX6ULL驱动开发学习】08.IMX6ULL通过GPIO子系统函数点亮LED

通过GPIO子系统函数点亮LED 1、GPIO子系统函数 1.1 确定 led 的GPIO标号&#xff0c;查看内核中的gpiochip 查看 gpiochip &#xff0c;以正点原子的IMX6ULL阿尔法开发板为例 [root100ask:/sys/class/gpio]# cat /sys/kernel/debug/gpio 查看原理图&#xff0c;发现led接的引…

Linux虚拟网络设备---之使用Veth pair连接linux网桥bridge

本文目录 1、我们可以用以下命令来创建veth pair: veth0----veth12、创建五个命名空间namespaces后&#xff0c;可以用以下命令将veth设备对的一端移入namespaces命名空间&#xff0c;并开启veth2、将veth设备对的另外一端连接到linux网桥&#xff0c;并将所有namespaces命名空…

【Redis应用】UV统计(四)

&#x1f697;Redis应用学习第四站~ &#x1f6a9;本文已收录至专栏&#xff1a;Redis技术学习 一.引入 首先我们要搞懂两个概念&#xff1a; UV&#xff1a;全称Unique Visitor&#xff0c;也叫独立访客量&#xff0c;是指通过互联网访问、浏览这个网页的自然人。1天内同一个…

【动态规划】斐波那契数列模型

冻龟算法系列之斐波那契数列模型 文章目录 【动态规划】斐波那契数列模型1. 第N个泰波那契数1.1 题目解析1.2 算法原理1.2.1 状态表示1.2.2 状态转移方程1.2.3 初始化1.2.4 填表顺序1.2.5 返回值 1.3 编写代码1.4 空间优化 2. 三步问题2.1 题目解析2.2 算法原理2.2.1 状态表示2…

解决Centos安装时找不到磁盘:未选择任何磁盘(no diks selected),本地标准磁盘为空

文章目录 问题描述问题原因解决办法 问题描述 笔者最近又买了一台新电脑&#xff0c;并打算在上面安装 Linux 来充当一个新的服务器结点。但很不幸的是&#xff0c;每次笔者略微尝试新事物时&#xff0c;都要踩很多坑。笔者在使用 U 盘刻录 CentOS 8 镜像之后&#xff0c;准备在…

公平锁/非公平锁/可重入锁/自旋锁

在JAVA中我们知道有很多加锁的方式&#xff0c;比如常见的 通过synchronized关键字&#xff0c;还有Lock&#xff0c;还有之前说原子CAS操作时有看到过的死循环方式的自旋锁。 借此来说一下锁的分类: 公平锁: 是指多个线程按照申请的顺序来获取锁&#xff0c;每次获取锁时会…