SpringBoot----(1)基础

news2024/12/22 18:03:57

目录

  • 1 SpringBoot简介
    • 1.1 入门案例(IDEA构建)
    • 1.2 官网构建工程
    • 1.3 SpringBoot程序快速启动
    • 1.4 SpringBoot概述
    • 1.5 起步依赖
    • 1.6 程序启动
    • 1.7 切换web服务器
  • 2 配置
    • 2.1 配置文件格式(3种)
    • 2.2 yaml格式
    • 2.3 yaml数据读取方式(3种)
    • 2.4 多环境配置
    • 2.5 多环境启动的命令格式
    • 2.6 maven和springboot多环境开发兼容
    • 2.7 配置文件分类
  • 3 SpringBoot整合JUnit
    • 3.1 环境准备
    • 3.2 编写测试类
  • 4 SpringBoot整合SSM
  • 5 案例:基于SpringBoot的SSM整合案例

1 SpringBoot简介

1.1 入门案例(IDEA构建)

  • SpringBoot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程
  1. 创建新模块,选择Spring初始化,并配置模块相关基础信息
    在这里插入图片描述
  2. 选择当前模块需要用到的技术集
    在这里插入图片描述

在创建好的工程中不需要创建SpringConfig和SpringMvcConfig配置类
创建好的项目会自动生成其他的一些文件,而这些文件目前对我们来说没有任何作用,所以可以将这些文件删除。
可以删除的目录和文件如下:
.mvn
.gitignore
HELP.md
mvnw
mvnw.cmd

  1. 开发控制器
@RestController
@RequestMapping("/books")
public class BookController {
 
    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id){
        System.out.println("id ==> "+id);
        return "hello , spring boot!";
    }
}
  1. 运行自动生成的Application类
    运行 SpringBoot 工程不需要使用本地的 Tomcat 和 插件,只需要右键运行项目 com.zs包下的 Application 类,我们就可以在控制台看出如下信息
    在这里插入图片描述

这里是引用
报错原因:SpringBoot 3.0以上版本要求JDK 17以上,jdk版本1.8 与 spring boot 3.0.1 版本不匹配在这里插入图片描述
SpringBoot 对比Spring
在这里插入图片描述
基于Idea的 Spring Initializr 快速构建 SpringBoot 工程时需要联网。

1.2 官网构建工程

官网:https://spring.io/projects/spring-boot
进入到 SpringBoot 官网后拖到最下方,点击 Spring Initializr
在这里插入图片描述配置:
在这里插入图片描述

以上步骤完成后就可以生成 SpringBoot 工程了。在页面的最下方点击 GENERATE CTRL + 回车 按钮生成工程并下载到本地
打开下载好的压缩包可以看到工程结构和使用 Idea 生成的一模一样在这里插入图片描述

1.3 SpringBoot程序快速启动

问题:
在这里插入图片描述
以后我们和前端开发人员协同开发,而前端开发人员需要测试前端程序就需要后端开启服务器,这就受制于后端开发人员。为了摆脱这个受制,前端开发人员尝试着在自己电脑上安装 Tomcat 和 Idea ,在自己电脑上启动后端程序,这显然不现实。
解决:
我们后端可以将 SpringBoot 工程打成 jar 包,该 jar 包运行不依赖于 Tomcat 和 Idea 这些工具也可以正常运行,只是这个 jar 包在运行过程中连接和我们自己程序相同的 Mysql 数据库即可。这样就可以解决这个问题,如下图:
在这里插入图片描述
打包:

打包package前先clean是好习惯

先终止当前运行的项目。由于我们在构建 SpringBoot 工程时已经在 pom.xml 中配置了spring-boot-maven-plugin插件

//spring-boot-maven-plugin插件打包时需要的
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

注意:该插件必须配置,不然打好的 jar 包也是有问题的。

所以我们只需要使用 Maven 的 package 指令打包就会在 target 目录下生成对应的 Jar 包
在这里插入图片描述
进入 jar 包所在位置,地址栏输入cmd回车,在 命令提示符 中输入如下命令:

java -jar springboot_01_quickstart-0.0.1-SNAPSHOT.jar

输入s然后点个Tab键就可以直接: springboot_01_quickstart-0.0.1-SNAPSHOT.jar

在这里插入图片描述
然后postman发请求,可以看到命令行里输出后端信息,postman展示响应信息。
在这里插入图片描述

非springboot的maven是不能用java -jar命令的

1.4 SpringBoot概述

  • SpringBoot 是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程
  • Spring程序的缺点:
    • 配置繁琐
    • 依赖设置繁琐
  • SpringBoot 程序优点:
    • 自动配置。这个是用来解决 Spring 程序配置繁琐的问题
    • 起步依赖(简化以来配置)。这个是用来解决 Spring 程序依赖设置繁琐的问题
    • 辅助功能(内置服务器,…)。我们在启动 SpringBoot 程序时既没有使用本地的 tomcat 也没有使用 tomcat 插件,而是使用 SpringBoot 内置的服务器。

1.5 起步依赖

我们使用 Spring Initializr 方式创建的 Maven 工程的的 pom.xml 配置文件中自动生成了很多包含 starter 的依赖
在这里插入图片描述
这些依赖就是启动依赖

从上面的文件中可以看到指定了一个父工程,我们ctrl+b进入到父工程,发现父工程中又指定了一个父工程
在这里插入图片描述

再进入到该父工程中,在该工程中我们可以看到配置内容结构
在这里插入图片描述
properties 标签中定义了各个技术软件依赖的版本,避免了我们在使用不同软件技术时考虑版本的兼容问题
在 properties 中我们找 servlet 和 mysql 的版本如下图
在这里插入图片描述
爷工程pom.xml里依赖管理标签:
dependencyManagement 标签是进行依赖版本锁定,但是并没有导入对应的依赖。
如果我们工程需要哪个依赖只需要引入依赖的 groupid 和 artifactId 不需要定义 version
在这里插入图片描述
build 标签中也对插件的版本进行了锁定
在这里插入图片描述
在我们创建的工程中的 pom.xml 中配置了spring-boot-starter-web依赖:
在这里插入图片描述
进入到该依赖,查看 pom.xml 的依赖会发现它引入了引入了 spring-web 和 spring-webmvc 的依赖,这就是为什么我们的工程中没有依赖这两个包还能正常使用 springMVC 中的注解的原因。
在这里插入图片描述
而依赖 spring-boot-starter-tomcat ,从名字基本能确认内部依赖了 tomcat,所以我们的工程才能正常启动。
结论:以后需要使用技术,只需要引入该技术对应的起步依赖即可
同样方法,spring-boot-starter-test依赖里有spring-test等依赖。

  • starter

    • 只要依赖名字中有starter,就一定是起步依赖。starter是SpringBoot 中常见项目名称,定义了当前项目使用的所有项目坐标,以达到减少依赖配置的目的。
  • parent

    • 所有 SpringBoot 项目要继承的项目,定义了若干个坐标版本号(依赖管理,而非依赖),以达到减少依赖冲突的目的
      spring-boot-starter-parent(2.5.0)与 spring-boot-starter-parent(2.4.6)共计57处坐标版本不同。springboot版本也不是越新越好,实际开发中要看公司项目的spring-boot-starter-parent版本,然后使用对应的springboot版本。
  • 实际开发

    • 使用任意坐标时,仅书写GAV中的G和A,V由SpringBoot提供
      G:groupid;A:artifactId;V:version

    • 如发生坐标错误,再指定version(要小心版本冲突)

  • 辅助功能
    在这里插入图片描述
    在starter-web中引入了tomact starter就可以让程序内置了一个tomcat服务器,这个功能就是辅助功能(不是用来做程序的,是用来启动程序的),不能提供业务功能(如导入junit能做测试,导入logback能做日志)

1.6 程序启动

创建的每一个 SpringBoot 程序时都包含一个类似于下面的类,我们将这个类称作引导类、主启动类

@SpringBootApplication
public class SpringbootApplication {

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

}
  • SpringBoot 在创建项目时,采用jar的打包方式
  • SpringBoot 的引导类是项目的入口,运行 main 方法就可以启动项目

因为我们在 pom.xml 中配置了 spring-boot-starter-web 依赖,而该依赖通过前面的学习知道它依赖 tomcat ,所以运行 main 方法就可以使用 tomcat 启动咱们的工程。

1.7 切换web服务器

使用spring-boot-starter-web 依赖实现内置Tomcat服务器,是springboot带来的辅助功能。
现在我们启动工程使用的是 tomcat 服务器,那能不能不使用 tomcat 而使用 jetty 服务器。
jetty 在我们 maven 高级时讲 maven 私服使用的服务器,比Tomcat更轻量级,可扩展性强,谷歌应用引擎已全面切换为Jetty,但目前大型应用一般用的还是Tomcat。
而要切换 web 服务器就需要使用 exclusion 标签将默认的 tomcat 服务器给排除掉。

  • 使用maven依赖管理变更起步依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <groupId>org.springframework.boot</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
  • Jetty比Tomcat更轻量级,可扩展性更强(相较于Tomcat),谷歌应用引擎(GAE)已全面切换为Jetty

2 配置

2.1 配置文件格式(3种)

  • application.properties,常用,在resources包下
server.port=80
  • application.yml(以后用这种)
server:
	port: 81
  • application.yaml
server:
	port: 82

SpringBoot 程序的配置文件名必须是 application ,只是后缀名不同而已

自动提示功能消失解决方案:
在配置文件中输入port,如果没有提示,可以使用以下方式解决
在这里插入图片描述
点击绿叶图标追加配置文件:
在这里插入图片描述
点击加号选择要添加的配置文件:
在这里插入图片描述
在这里插入图片描述

  • SpringBoot三种配置文件加载顺序(了解)

    • application.properties > application.yml > application.yaml
  • SpringBoot 内置属性过多,且所有属性集中在一起修改,在使用时,通过提示键+关键字修改属性

    • 例如要设置日志的级别时,可以在配置文件中书写 logging,就会提示出来。配置内容:
logging:
  level:
    root: info

2.2 yaml格式

  • YAML(YAML Ain’t Markup Language),一种数据序列化格式。
  • 优点:
    • 容易阅读
      yaml 类型的配置文件比 xml 类型的配置文件更容易阅读,结构更加清晰
    • 容易与脚本语言交互
      以数据为核心,重数据轻格式,如下图数据清爽
    • yaml 更注重数据,而 xml 更注重格式
  • YAML文件扩展名
    • .yml(主流)
    • .yaml
  • yaml语法规则
    • 大小写敏感
    • 属性层级关系使用多行描述,每行结尾使用冒号结束(这里冒号说的是标签名后的冒号)
    • 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)
    • 空格的个数并不重要,只要保证同层级的左侧对齐即可。
    • 属性值前面添加空格(属性名与属性值之间使用冒号加空格作为分隔)
    • #表示注释

核心规则:数据前面要加空格与冒号隔开

  • 数组数据在数据书写位置的下方使用减号作为数据开始符号,每行书写一个数据,减号与数据间空格分隔

【示例】

enterprise:
  name: itcast
  age: 16
  tel: 4006184000
  subject:
    - Java
    - 前端
    - 大数据

2.3 yaml数据读取方式(3种)

  • 环境准备:
    新创建一个 SpringBoot 工程
    在 com.zs.controller 包写创建名为 BookController 的控制器
@RestController
@RequestMapping("/books")
public class BookController {
 
    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id){
        System.out.println("id ==> "+id);
        return "hello , spring boot!";
    }
}

在 com.zs.domain 包下创建一个名为 Enterprise 的实体类等会用来封装数据

public class Enterprise {
    private String name;
    private int age;
    private String tel;
    private String[] subject;
    
    //setter and getter
    
    //toString
}

在 resources 下创建一个名为 application.yml 的配置文件

lesson: SpringBoot
 
server:
  port: 80
 
enterprise:
  name: itcast
  age: 16
  tel: 4006184000
  subject:
    - Java
    - 前端
    - 大数据
  • 方式一:使用@Value读取单个数据,属性名引用方式:${一级属性名.二级属性名…}(读取单个数据)
    在这里插入图片描述

  • 方式二:封装全部数据到Environment对象(封装读取全部数据)

    • 将配置文件中所有的数据封装到 Environment 对象中,如果需要使用哪个数据只需要通过调用 Environment 对象的 getProperty(String name) 方法获取
      在这里插入图片描述
  • 方式三:自定义对象封装指定数据(常用)

    • 将实体类 bean 的创建交给 Spring 管理。在类上添加 @Component 注解
    • 使用 @ConfigurationProperties 注解表示加载配置文件,在该注解中也可以使用 prefix 属性指定只加载指定前缀的数据
    • 在 BookController 中进行注入
      在这里插入图片描述
  • 自定义对象封装数据警告解决方案

    • 问题:使用第三种方式,在实体类上有如下警告提示
      在这里插入图片描述
    • 解决:这个警告提示解决是在 pom.xml 中添加如下依赖即可
      在这里插入图片描述

2.4 多环境配置

以后在工作中,对于开发环境、测试环境、生产环境的配置肯定都不相同,比如我们开发阶段会在自己的电脑上安装 mysql ,连接自己电脑上的 mysql 即可,但是项目开发完毕后要上线就需要该配置,将环境的配置改为线上环境的
在这里插入图片描述

来回的修改配置会很麻烦,而 SpringBoot 给开发者提供了多环境的快捷配置,需要切换环境时只需要改一个配置即可。不同类型的配置文件多环境开发的配置都不相同

  • yaml文件多环境启动
    • 在 application.yml 中使用 — 来分割不同的配置

连接符—作用:单文件中可以通过—实现多文件的效果

#设置启用的环境
spring:
  profiles:
    active: dev  #表示使用的是开发环境的配置
 
---
#开发
spring:
  profiles: dev
server:
  port: 80
---
#生产
spring:
  profiles: pro
server:
  port: 81
---
#测试
spring:
  profiles: test
server:
  port: 82
---

注意:在上面配置中给不同配置起名字的 spring.profiles 配置项已经过时。最新用来起名字的配置项是:
在这里插入图片描述

  • properties文件多环境启动
    • 主启动配置文件:application.properties
      在这里插入图片描述

    • 环境分类配置文件:application-pro.properties
      在这里插入图片描述

    • 环境分类配置文件:application-dev.properties
      在这里插入图片描述

    • 环境分类配置文件:application-test.properties
      在这里插入图片描述

2.5 多环境启动的命令格式

使用 SpringBoot 开发的程序以后都是打成 jar 包,通过 java -jar xxx.jar …的方式启动服务的

打包时注意两个坑:
坑一: 执行package命令前先执行以下clean命令,避免上一次的结果影响本次操作。
坑二:配置文件中偶尔可能写中文,会导致打包失败,更改一下配置
在这里插入图片描述

带参数启动SpringBoot:

java –jar springboot.jar –-spring.profiles.active=test
java –jar springboot.jar –-server.port=88
java –jar springboot.jar –-server.port=88 –-spring.profiles.active=test

注意: 命令行启动参数都是临时更改,不影响源代码

进行测试后就会发现命令行设置的端口号优先级高(也就是使用的是命令行设置的端口号),配置的优先级SpringBoot官网上进行了说明
在这里插入图片描述

2.6 maven和springboot多环境开发兼容

Maven和springboot都有profile环境配置,在实际开发中,应该maven为主,springboot为辅。springboot读取maven多环境配置

  1. Maven中设置多环境属性
    在这里插入图片描述

  2. SpringBoot中引用Maven属性
    在这里插入图片描述

  3. 执行Maven打包命令

    • 问题:Maven指令执行完毕后,生成对应的包,其中类参与编译,但是配置文件并没有编译,而是复制到包中
      在这里插入图片描述

    • 解决思路:对于源码中非java类的操作要求加载Maven对应的属性,解析${}占位符
      对资源文件开启默认占位符的解析
      在这里插入图片描述

    • 解决完后,Maven打包加载到属性,打包顺利执行
      在这里插入图片描述

2.7 配置文件分类

问题:由于测试环境和开发环境的很多配置都不相同,所以测试人员在运行我们的工程时需要临时修改很多配置
解决方案:针对这种情况,SpringBoot 定义了配置文件不同的放置的位置;而放在不同位置的优先级时不同的。

SpringBoot 中4级配置文件放置位置:

  • 1级:file :config/application.yml(最高)
  • 2级:file :application.yml
  • 3级:classpath:config/application.yml
  • 4级:classpath:application.yml(最低)

一二级留作系统打包后设置通用属性
三四级用于系统开发阶段设置通用属性

注意:SpringBoot 2.5.0版本存在一个bug,我们在使用这个版本时,需要在 jar 所在位置的 config 目录下创建一个任意名称的文件夹

3 SpringBoot整合JUnit

SpringBoot 整合 junit:

  • 在测试类上添加 SpringBootTest 注解
  • 使用 @Autowired 注入要测试的资源
  • 定义测试方法进行测试

3.1 环境准备

  1. 创建名为springboot_test的springboot工程
  2. 在com.zs.service目录下创建BookService接口和impl.BookServiceImpl实现类
public interface BookService {
    public void save();
}
@Service
public class BookServiceImpl implements BookService {
    @Override
    public void save() {
        System.out.println("book service is running ...");
    }
}

3.2 编写测试类

在test/java目录下创建com.zs包,在该包下编写测试类

@SpringBootTest
class Springboot07TestApplicationTests {
 
    @Autowired
    private BookService bookService;
 
    @Test
    public void save() {
        bookService.save();
    }
}

注意:这里的引导类所在包必须是测试类所在包及其子包。
例如:引导类所在包是 com.itheima;测试类所在包也是 com.itheima
如果不满足这个要求的话,就需要在使用 @SpringBootTest 注解时,使用 classes 属性指定引导类的字节码对象。如 @SpringBootTest(classes = Springboot07TestApplication.class)

4 SpringBoot整合SSM

在这里插入图片描述
SpringBoot整合SSM两个关键步骤:@Mapper和yml配置数据源

  • 在dao接口@Mapper或引导类@MapperScan,类同于ssm中MybatisConfig的mapper扫描包。
  • 导入druid依赖、在application.yml中配置数据源dataSource。
  1. 创建新模块,选择Spring Initializr,并配置模块相关的基础信息
    在这里插入图片描述

  2. 选择当前模块需要使用的技术集(Mybatis、MySQL)
    在这里插入图片描述

  3. 定义实体类Book

public class Book {
    private Integer id;
    private String name;
    private String type;
    private String description;
    
    //setter and  getter.....
    
    //toString
}
  1. 设置数据源参数
    在这里插入图片描述
    ps:记得导入Druid的坐标

com.mysql.jdbc.Driver与com.mysql.cj.jdbc.Driver的区别:
JDBC连接Mysql5需用com.mysql.jdbc.Driver
JDBC连接Mysql6需用com.mysql.cj.jdbc.Driver,同时url需要指定时区serverTimezone。
设定时区时,serverTimezone=UTC比中国时间早8个小时,若在中国,可设置serverTimezone=Asia/Shanghai

注意:
SpringBoot 版本低于2.4.3(不含),Mysql驱动版本大于8.0时,需要在url连接串中配置时区 jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC,或在MySQL数据库端配置时区解决此问题

  1. 定义数据层接口与映射配置
@Mapper
public interface BookDao {
    @Select("select *from tbl_book where id = #{id}")
    public Book getById(Integer id);
}
  1. 测试类注入Dao接口,测试功能
@SpringBootTest
class SpringbootMybatisApplicationTests {
    @Autowired
    private BookDao bookDao;
    @Test
    void testGetById() {
        Book book = bookDao.getById(1);
        System.out.println(book);
    }
}

5 案例:基于SpringBoot的SSM整合案例

  1. 创建SpringBoot工程,勾选技术集(web、mysql、mybatis),将之前做的ssm_paage项目拷贝过来,修改成 SpringBoot 的即可
    在这里插入图片描述导入需要的坐标Druid:
<!--TODO 添加必要的依赖坐标-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.16</version>
</dependency>
  1. application.yml:设置数据源、端口等
server:
  port: 80
 
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ssm_db?servierTimezone=UTC
    username: root
    password: root
  1. 配置类config直接删除掉
  2. dao设置@Mapper
//TODO 添加@Mapper
@Mapper
public interface BookDao {
    @Insert("insert into tbl_book values (null, #{type}, #{name}, #{description})")
    int save(Book book);
    @Update("update tbl_book set type = #{type}, name = #{name}, description = #{description} where id = #{id}")
    int update(Book book);
    @Delete("delete from tbl_book where id = #{id}")
    int delete(Integer id);

    @Select("select * from tbl_book where id = #{id}")
    Book getById(Integer id);
    @Select("select * from tbl_book")
    List<Book> getAll();
}
  1. 测试类
@SpringBootTest
public class BookServiceTest {
    @Autowired
    private BookService bookService;

    @Test
    public void testGetById(){
        Book book = bookService.getById(2);
        System.out.println(book);
    }
    
    @Test
    public void testGetAll(){
        List<Book> bookList = bookService.getAll();
        System.out.println(bookList);
    }
}
  1. 页面
    静态资源放置在 resources 目录下的 static 下
    在这里插入图片描述
    可以配置一个index.html,实现直接http://localhost/即可访问books列表
    在这里插入图片描述
  2. 运行测试功能
    在这里插入图片描述

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

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

相关文章

Maven-----进阶

目录 1 分模块开发1.1 分模块开发的意义1.2 分模块开发实现 2 依赖管理2.1 依赖传递2.2 依赖传递冲突问题2.3 可选依赖和排除依赖 3 继承与聚合3.1 聚合3.2 继承3.2 聚合与继承的区别 4 属性4.1 属性4.2 资源文件引用属性4.3 版本管理 5 多环境配置与使用5.1 多环境开发5.2 跳过…

【JavaSE】类和对象的封装

目录 【1】封装 【1.1】封装的概念 【1.2】访问限定符 【1.3】封装扩展之包 【1.3.1】包的概念 【1.3.2】导入包中的类 【1.3.3】自定义包 【1.3.4】包的访问权限控制举例 【1.3.5】常见的包 【2】static成员 【2.1】再谈学生类 【2.2】static修饰成员变量 【2.3】…

量子力学的应用:量子计算

亲爱的读者&#xff0c; 欢迎回到我们的量子力学系列文章。在前面的几篇文章中&#xff0c;我们已经深入探讨了量子力学的起源、基本概念、实验验证以及解释问题。今天&#xff0c;我们将聚焦在量子力学的一个引人注目的应用领域&#xff1a;量子计算。 1. 传统计算机与量子计…

【雕爷学编程】Arduino动手做(86)---4*4位 WS2812 全彩模块2

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

【图解CAN总线】-9-详述经典CAN和CANFD报文是如何收发的

目录 1 经典CAN/CANFD网络拓扑分解 2 CAN收发器“前后端的电平” 3 图解MCU芯片与CAN物理总线之间CAN报文收发过程 3.1 TX&#xff0c;RX和CAN H/L电平变化&#xff1a;ECU接收一个报文 3.2 TX&#xff0c;RX和CAN H/L电平变化&#xff1a;ECU发送一个报文 END 推荐阅读&…

【LeetCode】48.旋转图像

题目 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]…

OPC通信从入门到精通_1_OPC基础知识及简单C#程序编写(OPCDA,OPCUA简介;OPC通信数据流框架图;C#程序编写)

文章目录 1. OPC基础知识&#xff1a;OPCDA&#xff0c;OPCUA1.1 OPC基础知识1.2 OPC通信读写方式 2. OPC通信仿真2.1 上位机与PLC通过ModbusTCP直接通信2.2 OPC通信介绍及实例2.2.1 OPC通信与ModbusTCP比较2.2.2 OPC通信应用场景2.2.3 OPC DA通信仿真实例2.2.4 OPC UA通信仿真…

随手笔记——3D−3D:ICP理论

随手笔记——3D−3D&#xff1a;ICP理论 说明SVD 方法非线性优化方法 说明 ICP 的求解也分为两种方式&#xff1a;利用线性代数的求解&#xff08;主要是 SVD&#xff09;&#xff0c;以及利用非线性优化方式的求解&#xff08;类似于 Bundle Adjustment&#xff09;。 SVD 方…

Android平台GB28181设备接入模块之按需编码和双码流编码

技术背景 我们在做执法记录仪或指挥系统的时候&#xff0c;会遇到这样的情况&#xff0c;大多场景下&#xff0c;我们是不需要把设备端的数据&#xff0c;实时传给国标平台端的&#xff0c;默认只需要本地录像留底&#xff0c;如果指挥中心需要查看前端设备实时数据的时候&…

【LeetCode热题100】打卡第44天:倒数第30~25题

文章目录 【LeetCode热题100】打卡第44天&#xff1a;倒数第30~25题⛅前言 移动零&#x1f512;题目&#x1f511;题解 寻找重复数&#x1f512;题目&#x1f511;题解 二叉树的序列化与反序列化&#x1f512;题目&#x1f511;题解 最长递增子序列&#x1f512;题目&#x1f5…

力扣 763. 划分字母区间

题目来源&#xff1a;https://leetcode.cn/problems/partition-labels/description/ C题解1&#xff1a; 先遍历一遍使用哈希算法找到每个小写字母的最远的索引&#xff0c;再遍历一次&#xff0c;不断更新每个片段的最远距离。 class Solution { public:vector<int> pa…

Qt Core学习日记——第八天QMetaObject(下)

QMetaObject::normalizedType 将名称规范化。 例如&#xff1a; QByteArray normType QMetaObject::normalizedType(" int const *"); // normType is now "const int*" QMetaObject::connect(const QObject *sender, int signal_index, const QObject…

redis(12):springboot使用redis注解做缓存

1 新建springboot项目 2 相关注解 EnableCaching 在启动类上加上注解启动缓存 #作用在你要缓存的数据上 Cacheable(key"#id",cacheNames"com.sxt.service.impl.MenuServiceImpl") Cacheput 解决脏读 CachEvict&#xff08;解决脏读&#xff09; Cach…

01Mybatis报错日志 BindingException

01 Mybatis报错日志 BindingException Type interface com.zhnx.demo1.mapper.UserMapper is not known to the MapperRegistry. org.apache.ibatis.binding.BindingException: Type interface com.zhnx.demo1.mapper.UserMapper is not known to the MapperRegistry.at org…

腾讯云服务器公共镜像大全_Linux和Windows操作系统

腾讯云CVM服务器的公共镜像是由腾讯云官方提供的镜像&#xff0c;公共镜像包含基础操作系统和腾讯云提供的初始化组件&#xff0c;公共镜像分为Windows和Linux两大类操作系统&#xff0c;如TencentOS Server、Windows Server、OpenCloudOS、CentOS Stream、CentOS、Ubuntu、Deb…

LeetCode116. 填充每个节点的下一个右侧节点指针

116. 填充每个节点的下一个右侧节点指针 文章目录 [116. 填充每个节点的下一个右侧节点指针](https://leetcode.cn/problems/populating-next-right-pointers-in-each-node/)一、题目二、题解方法一&#xff1a;迭代方法二&#xff1a;递归 一、题目 给定一个 完美二叉树 &…

redis的并发安全问题:redis的事务VSLua脚本

redis为什么会发生并发安全问题&#xff1f; 在redis中&#xff0c;处理的数据都在内存中&#xff0c;数据操作效率极高&#xff0c;单线程的情况下&#xff0c;qps轻松破10w。反而在使用多线程时&#xff0c;为了保证线程安全&#xff0c;采用了一些同步机制&#xff0c;以及多…

grid map学习笔记1之Ubuntu18.04+ROS-melodic编译安装grid_map栅格地图及示例运行

文章目录 0 引言1 安装依赖和编译1.1 安装依赖1.2 下载编译 2 运行示例2.1 simple_demo2.2 tutorial_demo2.3 iterators_demo2.4 image_to_gridmap_demo2.5 grid_map_to_image_demo2.6 opencv_demo2.7 resolution_change_demo2.8 filters_demo2.9 interpolation_demo 0 引言 苏…

java项目之个人交友网站(ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的个人交友网站。技术交流和部署相关看文章末尾&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框架&…

计算机启动过程uefi+gpt方式

启动过程&#xff1a; 一、通电 按下开关&#xff0c;不用多说 二、uefi阶段 通电后&#xff0c;cpu第一条指令是执行uefi固件代码。 uefi固件代码固化在主板上的rom中。 &#xff08;一&#xff09;uefi介绍 UEFI&#xff0c;全称Unified Extensible Firmware Interface&am…