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

初始SpringBoot

初始SpringBoot

  • 1. SpringBoot创建和运行
    • 1.1. SpringBoot的概念
    • 1.2. SpringBoot的优点
    • 1.3. SpringBoot的创建
      • 1.3.0. 前置工作:安装插件(这是社区版需要做的工作, 专业版可以忽略)
      • 1.3.1. 社区版创建方式
      • 1.3.2. 专业版创建方式
      • 1.3.3. 网页版创建方式
    • 1.4. 项目目录介绍
    • 1.5. SpringBoot项目的运行
    • 1.6. 网页输出 Hello World
  • 2. SpringBoot的配置文件
    • 2.1. 配置文件的作用
    • 2.2. 配置文件的格式
      • 2.2.1. 关于 .properties文件
      • 2.2.2. 关于 .yml文件
        • 2.2.2.1. .yml属于新版本的配置文件. 是ymal的缩写
        • 2.2.2.2. .yml文件的优势
        • 2.2.2.3. yml基本语法
        • 2.2.2.4. yml配置读取
        • 2.2.2.4. yml进阶使用
          • 1. yml 配置不同数据类型及 null
          • 2. yml中value值添加单双引号的区别
          • 3. 配置对象
          • 4. 配置集合
  • 3. SpringBoot的日志文件
    • 3.1. 日志使用
    • 3.2. 日志级别
    • 3.3. 日志持久化
    • 3.4. 更简单的日志输出 -- lombok
      • 3.4.1. 添加lombok依赖
      • 3.4.2. 使用 @slf4j 注解代替输出日志
  • 4. lombok的更多注解说明

1. SpringBoot创建和运行

1.1. SpringBoot的概念

SpringBoot称为Spring的脚手架(脚手架就是盖房子的框架).

Spring是为了简化Java程序的开发诞生的, 而SpringBoot是为了简化Spring程序开发诞生的.所以称为Spring的框架.

1.2. SpringBoot的优点

  1. 快速集成框架
    • Spring Boot 提供了启动添加依赖的功能,用于秒级集成各种框架
  2. 内置运行容器
    • 无需配置 Tomcat 等 Web 容器,直接运行和部署程序
  3. 快速部署项目
    • 无需外部容器即可启动并运行项目
  4. 抛弃Spring中繁琐的XML方式
    • 使用注解和配置的方式进行开发
  5. 支持更多的监控的指标
    • 可以更好的了解项目的运行情况

1.3. SpringBoot的创建

这里有三种创建方式, 专业版idea中自带方式, 和 社区版安装插件后的方式. 第三种方式, 就是在官网下载项目的压缩包.然后解压到自己选择的位置, 再用idea打开即可.(其实三种方式大同小异, 知道一种也可以很快的熟悉另外两种方式)

在这里插入图片描述

1.3.0. 前置工作:安装插件(这是社区版需要做的工作, 专业版可以忽略)

  1. 选择Settings进入设置页面

在这里插入图片描述

  1. 选择 Plugins --> Makelplace, 在搜索框中搜索插件名称 spring assistant. 选择插件点击 Install 即可

在这里插入图片描述

1.3.1. 社区版创建方式

  1. 为了不体现对待专业版特殊化, 我们先讲解社区版插件的方式

  2. 先选择New Project 进入到创建新项目的页面, 点击插件的模块

  3. 然后 选择自己对应的JDK 和 依赖源, 依赖源一般有默认值,可以不填写, 如果需要用国内稳定源, 可以在Custom中配置

在这里插入图片描述

  1. 填写相关的内容, 一般练习中需要更改的也就是 项目类型, Java版本 和 项目名称. 更改好以后, 继续点击Next

在这里插入图片描述

  1. 选择对应的SpringBoot的版本, 添加所需要的依赖.就可以点击Next了

在这里插入图片描述

  1. 这里需要注意地是 3的大版本要求JDK 最低版本为JDK17, 所以创建时对于版本的选择要谨慎, 选择合适的版本即可, 并不是版本越高越好.
  2. 填写项目名称, 并选择位置, 就可以点击Finish创建项目了

在这里插入图片描述

  1. 如果提醒没有这个文件夹, 选择Create创建就可以了

在这里插入图片描述

  1. 需要注意, 第一次打开Spring Boot项目需要加载很久, 因为当前SpringBoot框架没有在自己的本地仓库, 需要从网上拉取. 所以我们需要耐心等待
  2. 如图就说明加载完成了. 到这里 我们的项目也就创建成功了

在这里插入图片描述

1.3.2. 专业版创建方式

  1. 同样先选择New Project 进入到创建页面, 然后选择Spring Initializr框

  2. 填写相关内容, 如果需要更改拉取的源地址, 可以在上面更改. 填写好以后就可以点击Next

在这里插入图片描述

  1. 选择对应版本以及选择要添加的具体依赖. 点击Finish就开始创建了

在这里插入图片描述

  1. 耐心等待一会, 项目就加载好了

在这里插入图片描述

我们观察后, 不难发现, 两种创建方式创建出来的项目是没有什么差别的, 所以以后我们使用哪种方式都是可以的.

1.3.3. 网页版创建方式

  1. 首先访问官网地址: https://start.spring.io/

  2. 访问之后填写和更改具体内容, 选择要添加的依赖(内容和idea创建类似)

在这里插入图片描述

  1. 下载好以后解压出来, 用idea打开即可

1.4. 项目目录介绍

SpringBoot项目有两个主要的目录

  1. Java源代码目录
  2. 静态资源和配置文件的目录

具体细节如图:

在这里插入图片描述

1.5. SpringBoot项目的运行

  1. 打开运行类, 点击三角号即可运行(右上角的三角号同样功能)

在这里插入图片描述

启动类代码


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class ShowSpringbootUltimateApplication {public static void main(String[] args) {SpringApplication.run(ShowSpringbootUltimateApplication.class, args);}}
  1. 运行起来, 且等待一会项目没有报错, 就说明项目运行成功

在这里插入图片描述

1.6. 网页输出 Hello World

  1. 在启动类同包下创建一个包,包下新建一个类

在这里插入图片描述

  1. 直接输入 规范代码(包名全小写, 类名首字母大写). 图中格式会创建一个包, 包下创建一个类

在这里插入图片描述

  1. 图中为上图创建好后的目录格式. 包和启动类是同级别

在这里插入图片描述

  1. 在UserController中编写代码, 编写好以后重新启动项目

在这里插入图片描述

代码如下:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/user")
public class UserController {@RequestMapping("/sayhello")public String sayHi() {return "Hello World!";}
}
  1. 访问页面得到数据, 输出 Hello World 成功

在这里插入图片描述

注意事项: 约定大于配置!!! 上述编写代码, 运行成功是因为. 我们遵守了 项目要求的目录格式, 如果我们将controller没有建在启动类的包下, 就会出现错误.(SpringBoot 没有将对象注入到容器中). 因为默认情况下, 启动类只会注入自己同级别的包下的内容.所以要记住 约定大于配置.要遵守约定好的目录格式.

2. SpringBoot的配置文件

2.1. 配置文件的作用

整个项目中所有重要的数据都是在配置文件中配置的

  1. 数据库的连接信息
  2. 项目的启动端口
  3. 第三方系统的调用密钥
  4. 用于发现和定位问题的日志
  5. 等等

可见配置文件还是很重要的.

2.2. 配置文件的格式

一般有两种格式 .properties文件 和 .yml文件, 并且这两种格式的配置文件是可以共存的

在这里插入图片描述

2.2.1. 关于 .properties文件

  1. 属于老版本的配置文件, 是创建SpringBoot项目默认的配置文件

  2. 基本语法

    • 按照键值形式配置的, key和value之间是以 “=” 连接的
    • 示例
      • 配置端口号: server.port=8031
      • 注意: 周围不能有空格,包括"="周围
  3. 读取配置文件

    • 使用 @Value 注解读取 @Value(“${server.port}”)的格式读取. 编写代码, 并重启项目

在这里插入图片描述

代码如下:

# .properties文件
server.port=8031
// .java文件
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.PostConstruct;@RestController
@RequestMapping("/user")
public class UserController {@Value("${server.port}")private String port;@RequestMapping("/readport")public String readPort() {return "port: " + port;}@RequestMapping("/sayhello")public String sayHi() {return "Hello World!";}
}

重启项目, 访问页面观察结果

在这里插入图片描述

  1. .properties文件 缺点分析

以配置数据库为例, 可以观察出来很明显的缺点就是会有很多冗余信息

在这里插入图片描述

yml格式的配置文件就不会出现这样的冗余信息

2.2.2. 关于 .yml文件

2.2.2.1. .yml属于新版本的配置文件. 是ymal的缩写

2.2.2.2. .yml文件的优势

  1. yml的可读性高, 易于理解.并且它的语法和其他高级语言类似, 并且可以简单表达数组, 散列表, 标量等数据形态
  2. yml 最大的优势是可以跨语言, 不止是 Java 中可以使用. golang, python 都可以使用 yaml 作为配置文件

2.2.2.3. yml基本语法

基本语法: key: value

示例: key: value :和value中间必须有空格

在这里插入图片描述

使用yml连接数据库示例

在这里插入图片描述

代码如下:

# 演示yml配置数据库
spring:datasource:url: mysql://localhost:3306/fhs?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC&nullCatalogMeansCurrent=trueusername: rootpassword: 123456

2.2.2.4. yml配置读取

  • yml读取配置的方式 和properties的读取方式相同
  • 使用注解 @Value
    • @Value(“${string.hello}”)

2.2.2.4. yml进阶使用

1. yml 配置不同数据类型及 null

在这里插入图片描述

yml代码

# 字符串
string.value: Hello
# 布尔值,true或false
boolean.value: true
boolean.value1: false
# 整数
int.value: 10
int.value1: 0b1010_0111_0100_1010_1110 # 二进制
# 浮点数
float.value: 3.14159
float.value1: 314159e-5 # 科学计数法
# Null, ~代表null
null.value: ~
2. yml中value值添加单双引号的区别
  • 字符串默认不用加上单引号或者双引号
  • 单引号会转义特殊字符, 特殊字符最终只是⼀个普通的字符串数据(填写的什么就是什么)
  • 双引号不会转义字符串里面的特殊字符; 特殊字符会作为本身想表示的意思存在.(比如 \n 就是 换行)

在这里插入图片描述

application.yml代码

string:str1: Hello \n Spring Boot.str2: 'Hello \n Spring Boot.'str3: "Hello \n Spring Boot."

UserController.java代码

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.PostConstruct;@RestController
@RequestMapping("/user")
public class UserController {@Value("${string.str1}")private String str1;@Value("${string.str2}")private String str2;@Value("${string.str3}")private String str3;//初始化调用@PostConstructpublic void postConstruct() {System.out.println("string.str1:" + str1);System.out.println("string.str2:" + str2);System.out.println("string.str3:" + str3);}
}

补充: 关于@PostConstruct 注解

a. 类初始化时调用的方法放在这里的原因是因为希望在项目启动时观察到方法输出, 并且这个注解又需要等待 属性注入, 否则无意义b. 类初始化时调用的顺序1. 构造方法 Constructor2. @Autowired3. @PostConstruct
3. 配置对象

配置: 首先在配置文件中配置对象, 有两种配置写法 普通写法和行内写法,两种同等效益

在这里插入图片描述

application.yml代码

# 配置对象
student:id: 1name: Javaage: 18# 行内写法
student2: { id: 1,name: Java,age: 18 }

获取: 编写对象类, 获取配置信息并观察.

右键show_springboot_ultimate包选择New–>Java Class

在这里插入图片描述

在运行类同级目录下创建一个子包和一个对象类

在这里插入图片描述

编写对象类并获取配置内容. 这个时候就不能⽤ @Value 来读取配置中的对象了,此时要使⽤另⼀个注解 @ConfigurationProperties来读取

在这里插入图片描述

StudentComponent.java代码

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@ConfigurationProperties(prefix = "student")
@Component
public class StudentComponent {private int id;private String name;private int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "StudentComponent{" +"id=" + id +", name='" + name + ''' +", age=" + age +'}';}
}

编写代码, 并重启项目. 观察Student对象配置信息获取情况. 可以观察到,成功获取信息.

在这里插入图片描述

ReadYml.java代码

import com.example.show_springboot_ultimate.model.StudentComponent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Component
public class ReadYml {@Autowiredprivate StudentComponent studentComponent;@PostConstructpublic void postConstruct() {System.out.println(studentComponent);}
}
4. 配置集合

配置: 和配置对象类似, 有两种书写方式 普通写法和行内写法

在这里插入图片描述

application.yml代码

# 配置集合
dbtypes:name:- mysql- sqlserver- db2# 行内写法
dbtypes2: { name: [ mysql,sqlserver,db2 ] }

获取: 同样编写有集合属性的类来观察, 先在model包下New一个类

在这里插入图片描述

创建拥有集合属性的类来接收获取的配置文件的信息

在这里插入图片描述

编写代码并获取配置信息. 集合的读取和对象⼀样,也是使用 @ConfigurationProperties 注解来读取的

在这里插入图片描述

ListConfig.java代码

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.List;@Component
@ConfigurationProperties("dbtypes")
@Data
public class ListConfig {private List<String> name;
}

编写代码, 并重启项目. 观察集合配置信息获取情况. 可以观察到,成功获取信息.

在这里插入图片描述

ReadYmlList.java代码

import com.example.show_springboot_ultimate.model.ListConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Component
public class ReadYmlList {@Autowiredprivate ListConfig listConfig;@PostConstructpublic void postConstruct() {System.out.println(listConfig.getName());}
}

3. SpringBoot的日志文件

3.1. 日志使用

  1. 首先在程序中获取日志对象

在这里插入图片描述

  1. 使用日志打印

在这里插入图片描述

UserController.java代码


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.PostConstruct;/*** @author Echo* @version 1.0* date 2023/3/24    16:15* name UserController* @deprecated exercises:* 类初始化调用顺序* (1)构造方法Constructor* (2)@Autowired* (3)@PostConstruct*/
@RestController
@RequestMapping("/user")
public class UserController {//首先获取日志对象//不要导错包了.//import org.slf4j.Logger;//import org.slf4j.LoggerFactory;private static Logger logger = LoggerFactory.getLogger(UserController.class);@Value("${server.port}")private String port;@Value("${string.str1}")private String str1;@Value("${string.str2}")private String str2;@Value("${string.str3}")private String str3;//初始化调用@PostConstructpublic void postConstruct() {logger.info("这是初始化方法的日志打印");System.out.println("string.str1:" + str1);System.out.println("string.str2:" + str2);System.out.println("string.str3:" + str3);}@RequestMapping("/readport")public String readPort() {//日志打印logger.info("这是返回获取配置文件中端口方法的日志打印");return "port: " + port;}@RequestMapping("/sayhello")public String sayHi() {//日志打印logger.info("这是访问方法时的日志打印");return "Hello World!";}
}
  1. 访问并观察

访问

观察

  1. 日志格式说明

在这里插入图片描述

日志格式: 日志打印时间 + 日志打印级别 + 线程ID + 线程名称 + 执行的类名 + 日志输出信息

3.2. 日志级别

  1. 日志级别分类

    • trace: 微量, 少许的意思, 级别最低
    • info: 普通的打印信息
    • debug: 需要调试时候的关键信息打印
    • warn: 警告, 不影响使用, 但需要注意的问题
    • error: 错误信息, 级别较高的错误日志信息
    • fatal: 致命的, 因为代码异常导致程序退出执行的事件
  2. 日志级别的顺序

在这里插入图片描述

越往上 , 接收到的消息越少(下打印的信息包含上的信息)

  1. 日志级别的配置

在这里插入图片描述

application.yml代码

# 配置日志打印等级
logging:level:root: trace

UserController.java代码

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.PostConstruct;
@RestController
@RequestMapping("/user")
public class UserController {//首先获取日志对象//不要导错包了.//import org.slf4j.Logger;//import org.slf4j.LoggerFactory;private static Logger logger = LoggerFactory.getLogger(UserController.class);@Value("${string.str1}")private String str1;@Value("${string.str2}")private String str2;@Value("${string.str3}")private String str3;//初始化调用@PostConstructpublic void postConstruct() {//不同等级日志打印logger.trace("这是初始化方法的日志打印");logger.debug("这是初始化方法的日志打印");logger.info("这是初始化方法的日志打印");logger.warn("这是初始化方法的日志打印");logger.error("这是初始化方法的日志打印");// fatal等级日志, 由于程序已经退出, 所以也就不会有打印了System.out.println("string.str1:" + str1);System.out.println("string.str2:" + str2);System.out.println("string.str3:" + str3);}
}
  1. 观察不同等级日志打印

在这里插入图片描述

3.3. 日志持久化

  1. 在配置文件中设置日志文件保存的目录即可自动保存日志.

在这里插入图片描述

application.yml代码

# 配置日志打印等级 + # 设置日志文件的目录
logging:file:path: D:\home\ruoyi # 日志文件保存位置level:root: trace

设置文件保存的名称(名称里就可以包含了文件的目录, 所以目录配置就可以省略)

在这里插入图片描述

application.yml代码

# 配置日志打印等级 + # 设置日志文件保存的名称 + # 设置日志文件的目录
logging:file:#  path: D:\home\ruoyi # 日志文件保存位置name: D:\home\ruoyi\spring-1204.log # 日志文件保存名称(内涵日志位置)level:root: trace

3.4. 更简单的日志输出 – lombok

3.4.1. 添加lombok依赖

在这里插入图片描述

依赖地址: https://mvnrepository.com/artifact/org.projectlombok/lombok/1.18.20

依赖内容:

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version><scope>provided</scope>
</dependency>

3.4.2. 使用 @slf4j 注解代替输出日志

使用注解代替一行代码, 节省工作量(毕竟程序员很累的)

在这里插入图片描述

UserService.java代码

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;/*** 使用更简便的得到日志的方法:注解*/
//@Service  设置为它无法直接访问路由
@Controller//此处没有它就无法访问路由
@ResponseBody
//此处方法没有返回任何信息,没有它就会返回500页面(因为方法无返回内容)
@Slf4j//代替了获取日志对象   (默认名称为log)
public class UserService {//得到日志对象 注解代替了下面的代码
//    private static final Logger log = LoggerFactory.getLogger(UserService.class);@RequestMapping("/sayhello")public void sayhello(){//名称同样为 loglog.trace("我是sayhello trace");log.debug("我是sayhello debug");log.info("我是sayhello info");log.warn("我是sayhello warn");log.error("我是sayhello error");}
}

4. lombok的更多注解说明

基本注解作⽤
@Getter⾃动添加 getter ⽅法
@Setter⾃动添加 setter ⽅法
@ToString⾃动添加 toString ⽅法
@EqualsAndHashCode⾃动添加 equals 和 hashCode ⽅法
@NoArgsConstructor⾃动添加⽆参构造⽅法
@AllArgsConstructor⾃动添加全属性构造⽅法, 顺序按照属性的定义顺序
@NonNull属性不能为 null
@RequiredArgsConstructor⾃动添加必需属性的构造⽅法, final + @NonNull 的 属性为必需
@Data@Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor + @NoArgsConstructor
@Slf4j添加⼀个名为 log 的⽇志, 使⽤ slf4j

相关文章:

初始SpringBoot

初始SpringBoot1. SpringBoot创建和运行1.1. SpringBoot的概念1.2. SpringBoot的优点1.3. SpringBoot的创建1.3.0. 前置工作:安装插件(这是社区版需要做的工作, 专业版可以忽略)1.3.1. 社区版创建方式1.3.2. 专业版创建方式1.3.3. 网页版创建方式1.4. 项目目录介绍1.5. SpringB…...

vue+springboot 上传文件、图片、视频,回显到前端。

效果图 预览&#xff1a; 视频&#xff1a; 设计逻辑 数据库表 前端vue html <div class"right-pannel"><div class"data-box"><!--上传的作业--><div style"display: block" id""><div class"tit…...

java入门-W3(K81-K143)

一. 什么是对象 什么是对象&#xff1f;之前我们讲过&#xff0c;对象就是计算机中的虚拟物体。例如 System.out&#xff0c;System.in 等等。然而&#xff0c;要开发自己的应用程序&#xff0c;只有这些现成的对象还远远不够。需要我们自己来创建新的对象。 例如&#xff0c…...

English Learning - L2 语音作业打卡 复习元音 [ɜː] [æ] 辅元连读技巧 Day42 2023.4.3 周一

English Learning - L2 语音作业打卡 复习元音 [ɜː] [] 辅元连读技巧 Day42 2023.4.3 周一&#x1f48c;发音小贴士&#xff1a;&#x1f48c;当日目标音发音规则/技巧:中元音 [ɜː]前元音 []辅元连读技巧&#x1f36d; Part 1【热身练习】&#x1f36d; Part2【练习内容】&…...

Thinkphp 6.0图像处理功能

本节课我们来学习一下图像处理功能&#xff0c;这功能是外置的&#xff0c;并非系统内置。 一&#xff0e;图像处理功能 1. 图像处理功能不是系统内置的功能了&#xff0c;需要通过 composer 引入进来&#xff1b; composer require topthink/think-image 2. 引入进来之后&…...

表格软件界的卷王,Excel、access、foxpro全靠边,WPS:真荣幸

Excel和Access就是表格软件的选择&#xff1f; 现在&#xff0c;铺天盖地的Excel的技能教程可谓是满天飞&#xff0c;有网上的教程&#xff0c;也有视频直播课程。 很多办公人员用Excel这种表格软件与VBA结合&#xff0c;甚至用不遗余力去学习Python编程语法&#xff0c;但Exce…...

Node.js -- http模块

1. 什么是http模块 在网络节点中&#xff0c;负责消费资源的电脑&#xff0c;叫客户端&#xff1b;负责对外提供网络资源的电脑&#xff0c;叫做服务器。 http模块是Node.js官方提供的&#xff0c;用来创建web服务器的模块。通过http模块提供的http.createServer()方法&#…...

静态库与动态库

库是已经写好的、成熟的、可复用的代码。在我们的开发的应用中经常有一些公共代码是需要反复使用的&#xff0c;就把这些代码编译为库文件。库可以简单看成一组目标文件的集合&#xff0c;将这些目标文件经过压缩打包之后形成的一个可执行代码的二进制文件。库有两种&#xff1…...

问题 A: C语言11.1

题目描述&#xff1a; 完成一个对候选人得票的统计程序。假设有3个候选人&#xff0c;名字分别为Li&#xff0c;Zhang和Fun。使用结构体存储每一个候选人的名字和得票数。记录每一张选票的得票人名&#xff0c;输出每个候选人最终的得票数。结构体可以定义成如下的格式&#x…...

SLAM中后端优化的技术细节总结与回答

SLAM中后端优化的技术细节 本文档主要收集总结了一些SLAM大佬们讲解后端优化中偏理论的技术细节的博客和回答以及一些学习教材。 Written by wincent 位姿估计以及李群相关的概述 Lie theory is by no means simple ———— 谎言理论绝不简单doge 《A micro Lie theory for st…...

小白快速学习Markdown

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…...

ToBeWritten之物联网WI-FI协议

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…...

C++模板元编程深度解析:探索编译时计算的神奇之旅

C模板元编程深度解析&#xff1a;探索编译时计算的神奇之旅引言C模板元编程的概念与作用模板元编程在现代C编程中的应用模板元编程基础类型萃取&#xff08;Type Traits&#xff09;编译时条件&#xff08;静态if&#xff09;模板元编程中的递归与终止条件模板元编程技巧与工具…...

姿态变换及坐标变换

目录0. 空见间变换&基变换0.0 空间变换0.1 基变换1.缩放、旋转、平移机器人齐次变换坐标系变换0. 空见间变换&基变换 这是矩阵分析的相关知识&#xff0c;有兴趣的参考第一篇知乎文章[1]. 0.0 空间变换 空间变换是指在同一组绝对基下的变换&#xff0c;可以想象为世…...

从命令行管理文件

目录标题文件命名规则创建、删除普通文件创建普通文件格式创建多个普通文件删除普通文件目录操作命令创建目录--mkdir命令统计目录及文件的空间占用情况--du命令删除目录文件复制、移动文件复制&#xff08;copy&#xff09;文件或目录--cp命令移动&#xff08;mv&#xff09;文…...

电脑无法正常关机?点了关机又会自动重启

“真木马”相信不少朋友遇到过电脑关机自动重启现象&#xff0c;一点关机&#xff0c;但随后电脑有会进入重启状态&#xff0c;就是一直不会停&#xff0c;属实是很难崩。 目录 一、问题症状 二、问题原因 三、解决方案 方法一&#xff1a; 1.关闭系统发生错误时电脑自动…...

English Learning - L2 语音作业打卡 复习双元音 [eɪ] [aɪ] r 谦让型爆破技巧 Day46 2023.4.7 周五

English Learning - L2 语音作业打卡 复习双元音 [eɪ] [aɪ] r 谦让型爆破技巧 Day46 2023.4.7 周五&#x1f48c;发音小贴士&#xff1a;&#x1f48c;当日目标音发音规则/技巧:[eɪ][aɪ]谦让型爆破&#x1f36d; Part 1【热身练习】&#x1f36d; Part2【练习内容】&#x…...

webgl-画任意多边形

注意&#xff1a; let canvas document.getElementById(webgl) canvas.width window.innerWidth canvas.height window.innerHeight let radio window.innerWidth/window.innerHeight; let ctx canvas.getContext(webgl) 由于屏幕长宽像素不一样&#xff0c;导致了长宽像素…...

代码随想录打卡第51天|309.最佳买卖股票时机含冷冻期;714.买卖股票的最佳时机含手续费

309.最佳买卖股票时机含冷冻期 关键点1&#xff1a;dp数组的含义 1-1&#xff1a;dp[i][0] 第i天持有股票的最大金钱 1-2&#xff1a;dp[i][1] 第i天卖出股票的最大金钱 1-3&#xff1a;dp[i][2] 第i天处于冷冻期的最大金钱 1-4&#xff1a;dp[i][3] 第i天保持卖出股票的最大金…...

Spark Shuffle介绍

文章目录1. 简介2. Hash Shuffle和Sort Shuffle2.1 Hash Shuffle2.1.1 未经优化的hashShuffleManager2.1.2 经优化的hashShuffleManager2.1.3 优化前后磁盘文件数对比2.2 Srot Shuffle Manager3. Shuffle配置选项1. 简介 Spark在DAG调度阶段会将一个Job划分为多个Stage&#x…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...

Linux 下 DMA 内存映射浅析

序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存&#xff0c;但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程&#xff0c;可以参考这篇文章&#xff0c;我觉得写的非常…...