Java研学-SpringBoot(四)

六 SpringBoot 项目搭建

1 创建项目

  spring2.X版本在2023年11月24日停止维护,而Spring3.X版本不支持JDK8,JDK11,最低支持JDK17,目前阿里云还是支持创建Spring2.X版本的项目
创建项目
选择所需模块

2 修改所需依赖版本 – pom

<?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.3.3.RELEASE</version>
        <relativePath/>
    </parent>
    <groupId>cn.tj</groupId>
    <artifactId>play_boot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>play_boot</name>
    <description>play_boot</description>
    <properties>
        <java.version>8</java.version>
    </properties>
    <dependencies>
        <!-- spring boot Web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- spring boot Test-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- Lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </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>
        </plugins>
    </build>
</project>

3 配置数据库连接池

 ① 添加依赖

<!--此处不需设置版本,父工程已经规定好了-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

 ② application.properties 文件配置4要素 – 小改(可在对应的DataSourceProperties文件中获取配置前缀)

# 不同版本对应不同的路径
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql:///play_boot?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root

 ③ 测试 此时会报NoSuchBeanDefinitionException错误,springboot实际上并没有帮我们创建这个Bean对象,这是因为@ConditionalOnClass 注解没有找到必需的类 javax.transaction.TransactionManager,此时将事务注解添加即可

// 错误信息
// @ConditionalOnClass did not find required class 'javax.transaction.TransactionManager' (OnClassCondition)
@SpringBootTest
class Play_bootApplicationTests {
    @Autowired
    private DataSource dataSource;
    @Test
    void testLoad(){
    	// Hikari连接池是springboot自带的,接下来要配置Druid 连接池
    	// HikariDataSource (null) 此时值不为null,只是显示为null(表示此刻没有配置)
        System.out.println(dataSource);
    }
}

 ④ 导入事务依赖,上面的测试可正常运行

<!-- Spring JDBCTX -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

 ⑤ 配置 Druid 连接池,添加依赖即可,Spring Boot 的自动配置中含有 DataSourceAutoConfiguration 配置类,会先检查容器中是否已经有连接池对象,有就用,没有则会使用默认的连接池(Hikari),此时通过 dataSource.getClass() 方法即可获取当前的连接池对象,com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceWrapper,springboot会自动帮我们装配DataSource 对象

<!-- druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.21</version>
</dependency>

4 集成 MyBatis

  集成 MyBatis 所需要的SqlSessionFactory 在springboot中会自动装配,而SqlSessionFactory 所需要的数据源,已经配置完了,此时需要配置的是实体类的别名(mapper映射文件编译后在同一文件夹中,故不需要配置)
 ① 导入依赖

<!-- Mybatis 集成到 SpringBoot 中的依赖 -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.1</version>
</dependency>

 ② application.properties 中配置实体类别名

mybatis.type-aliases-package=cn.tj.play_boot.domain

 ③ 测试 SqlSessionFactory 是否成功创建

@SpringBootTest
class Play_bootApplicationTests {
    @Autowired
    private DataSource dataSource;
    @Autowired
    private SqlSessionFactory sqlSessionFactory;
    @Test
    void testLoad(){
        //System.out.println(dataSource.getClass());
        System.out.println(sqlSessionFactory);
        // org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@799ed4e8
    }
}

 ④ 配置Mapper对象,扫描 Mapper 接口只要在配置类上贴个注解 @MapperScan 并指定扫描的包路径即可生成所有的mapper实体类。

@SpringBootApplication
@MapperScan("cn.tj.play_boot.mapper")
public class Play_bootApplication {
    public static void main(String[] args) {
        SpringApplication.run(Play_bootApplication.class, args);
    }
}

 ⑤ 测试时报错 The server time zone 数据库连接池连接失败短时间内会多次链接,这个错误出现的原因是没有设置时区

@SpringBootTest
class Play_bootApplicationTests {
    @Autowired
    private DataSource dataSource;
    @Autowired
    private SqlSessionFactory sqlSessionFactory;
    @Autowired
    private DepartmentMapper departmentMapper;
    @Test
    void testLoad(){
        //System.out.println(dataSource.getClass());
        //System.out.println(sqlSessionFactory);
        System.out.println(departmentMapper.selectAll());
    }
}

 ⑥ application.properties 中配置日志,设定日志级别

logging.level.cn.tj.play_boot.mapper=trace

 ⑦ 配置事务,导入事务依赖后,于service层贴上@Service注解,主启动类的注解就会找到他(service层的方法上含有事务注解@Transactional),直接测试即可

@SpringBootTest
class Play_bootApplicationTests {
    @Autowired
    private DataSource dataSource;
    @Autowired
    private SqlSessionFactory sqlSessionFactory;
    @Autowired
    private DepartmentMapper departmentMapper;
    @Autowired
    private DepartmentService departmentService;
    @Test
    void testLoad(){
        //System.out.println(dataSource.getClass());
        //System.out.println(sqlSessionFactory);
        //System.out.println(departmentMapper.selectAll());
        System.out.println(departmentService.listAll());
        // 查看对象类型真实对象说明没加事务,代理对象说明加事务了
        System.out.println(departmentService.getClass());
        // class cn.tj.play_boot.service.impl.DepartmentServiceImpl$$EnhancerBySpringCGLIB$$418bef25
        // 该类型为代理对象,说明加事务了
        // class cn.tj.play_boot.service.impl.DepartmentServiceImpl
        // 该类型为真实对象,没加事务
        // class com.sun.proxy.$Proxy61 此为JDK动态代理对象
    }
}

 ⑧ application.properties 中配置代理对象,可将代理对象设置为JDK动态代理,默认为CGLIB动态代理

# 默认为true,改为false即可更换为JDK动态代理
spring.aop.proxy-target-class=false

 ⑨ 数据库以及实体类

# 数据库
CREATE TABLE `department` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `sn` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=808 DEFAULT CHARSET=utf8;
// 实体类
@Data
public class Department {
    private Long id;
    private String name;
    private String sn;
}
// mapper接口
public interface DepartmentMapper {
    /*删除*/
    int deleteByPrimaryKey(Long id);
    /*增加*/
    int insert(Department record);
    /*根据id查询*/
    Department selectByPrimaryKey(Long id);
    /*查询所有*/
    List<Department> selectAll();
    /*修改*/
    int updateByPrimaryKey(Department record);
    /*查询总条数*/
    public int selectForCount(QueryObject qo);
    /*分页查询*/
    public List<Department> selectForList(QueryObject qo);
}
<!--mapper.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="cn.tj.play_boot.mapper.DepartmentMapper" >
  <resultMap id="BaseResultMap" type="cn.tj.play_boot.domain.Department" >
    <id column="id" property="id" jdbcType="BIGINT" />
    <result column="name" property="name" jdbcType="VARCHAR" />
    <result column="sn" property="sn" jdbcType="VARCHAR" />
  </resultMap>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long" >
    delete from department
    where id = #{id,jdbcType=BIGINT}
  </delete>
  <insert id="insert" parameterType="cn.tj.play_boot.domain.Department" useGeneratedKeys="true" keyProperty="id" >
    insert into department (name, sn)
    values (#{name,jdbcType=VARCHAR}, #{sn,jdbcType=VARCHAR})
  </insert>
  <update id="updateByPrimaryKey" parameterType="cn.tj.play_boot.domain.Department" >
    update department
    set name = #{name,jdbcType=VARCHAR},
      sn = #{sn,jdbcType=VARCHAR}
    where id = #{id,jdbcType=BIGINT}
  </update>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >
    select id, name, sn
    from department
    where id = #{id,jdbcType=BIGINT}
  </select>
  <select id="selectAll" resultMap="BaseResultMap" >
    select id, name, sn
    from department
  </select>
  <!--查询总条数-->
  <select id="selectForCount" resultType="int">
    SELECT count(*) from department
  </select>
  <!--分页查询部门-->
  <select id="selectForList" resultMap="BaseResultMap">
    SELECT * from  department limit #{start},#{pageSize}
  </select>
</mapper>

 ⑩ service层

// 接口
public interface DepartmentService {
    void delete(Long id);
    void save(Department department);
    Department get(Long id);
    List<Department> listAll();
    void update(Department department);
    /*分页查询*/
    PageResult<Department> query(QueryObject qo);
}
// 实现类
@Service
public class DepartmentServiceImpl implements DepartmentService {
    /*注入mapper*/
    @Autowired
    private DepartmentMapper departmentMapper;
    @Override
    public void delete(Long id) {
       departmentMapper.deleteByPrimaryKey(id);
    }
    // 事务注解
    @Transactional
    @Override
    public void save(Department department) {
       departmentMapper.insert(department);
    }
    @Override
    public Department get(Long id) {
        Department department = departmentMapper.selectByPrimaryKey(id);
        return department;
    }
    @Override
    public List<Department> listAll() {
        List<Department> departmentList = departmentMapper.selectAll();
        return departmentList;
    }
    @Override
    public void update(Department department) {
       departmentMapper.updateByPrimaryKey(department);
    }
    /*分页查询*/
    @Override
    public PageResult<Department> query(QueryObject qo) {
        //查询总条数
        int totalCount = departmentMapper.selectForCount(qo);
        if (totalCount==0){
            return new PageResult<>(qo.getCurrentPage(),qo.getPageSize(),0, Collections.emptyList());
        }
        //分页查询部门
        List<Department> departmentList = departmentMapper.selectForList(qo);
        //创建返回的分页对象
        PageResult<Department> pageResult=new PageResult<>(qo.getCurrentPage(),
                qo.getPageSize(),totalCount,departmentList);
        return pageResult;
    }
}

 小结
  springboot对持久层(1.2.3)及业务层(4.5.6)的优化
  1.自动配置DataSource对象,配置4要素同时导入指定连接池依赖(starter启动器)即可自动替换所需要的连接池对象
  2.自动配置SqlSessionFactory对象,配置指定实体类别名既可
  3.通过MapperScan注解优化Mapper对象,指定好具体路径可自动生成Mapper接口代理类
  4.不再扫描业务层对象
  5.不再配置事物管理器对象
  6.不再配置事务解析器对象

5 集成 Web

 ① 导入所需依赖

<!-- spring boot web 启动器(之前已添加了) -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

 ② application.properties 文件中修改端口号(浏览器端口默认80,地址中可省略书写端口号)

server.port=80

 ③ 于resources目录下创建static目录用来存放静态资源(原来位于webapp目录下的static目录),于resources目录下创建的templates模板目录用来存放模板(原来位于webapp目录下的WEB-INF目录中的views目录,类似WEB-INF不能直接访问),static相当于webapp这意味着路径中不需要输入static,但针对于静态资源需要放行的特点,以后拦截器要排除/static/**的路径,在application.properties中做了以下配置后,路径中就需要输入static了

// 告诉springboot访问静态资源路径以后都需要以/static/**开头 
// 所有以 /static/ 开头的 URL 都会被映射到静态资源目录
spring.mvc.static-path-pattern=/static/**

6 集成Thymeleaf

 ① 导入所需依赖

<!-- 引入 Thymeleaf 依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

 ② application.properties 文件中,配置Thymeleaf前缀(默认路径找templates目录,可省略)后缀(默认.html,可省略)model(默认HTML,可省略),编码集(默认UTF-8,可省略),缓存默认为true需要设置为false(开发阶段不建议打开缓存)

# 前缀
spring.thymeleaf.prefix=classpath:/templates/

# 后缀
spring.thymeleaf.suffix=.html

# model
spring.thymeleaf.mode=HTML

# model
spring.thymeleaf.mode=HTML

# 编码集
spring.thymeleaf.encoding=UTF-8

# 缓存
spring.thymeleaf.cache=false

 ③ controller层

@Controller
@RequestMapping("department")
public class DepartmentController {
    /*注入业务逻辑层对象*/
    @Autowired
    private DepartmentService departmentService;
    /*查询部门*/
    @RequestMapping("selectAll")
    public String selectAll(Model model){
        List<Department> departmentList = departmentService.listAll();
        model.addAttribute("departmentList",departmentList);
        return "department/list";
    }
    /*跳转到增加或修改页面*/
    @RequestMapping("input")
    public String input(Long id,Model model){
        /*根据id判断是否做修改*/
        if (id!=null){
            //根据id查询
            Department department = departmentService.get(id);
            //将部门对象存储到作用域
            model.addAttribute("department",department);
        }
        return "department/input";
    }
    /*保存增加或修改*/
    @RequestMapping("saveOrUpdate")
    public String saveOrUpdate(Department department){
        if (department.getId()!=null){
            //执行修改操作
            departmentService.update(department);
        }else {
            //执行增加操作
            departmentService.save(department);
        }
        //跳转查询
        return "redirect:/department/listAll";
    }
    /*删除部门*/
    @RequestMapping("delete")
    public String delete(Long id){
        departmentService.delete(id);
        return "redirect:/department/listAll";
    }
    /*分页查询部门*/
    @RequestMapping("listAll")
    public String listAll(Model model,
                          @RequestParam(value = "currentPage",required = false,defaultValue = "1") Integer currentPage,
                          @RequestParam(value = "pageSize",required = false,defaultValue = "2") Integer pageSize
                          /*参数value对应  required为false表示可以不传此参数  defaultValue表示不传参数时的默认值为何值*/
    ){
        QueryObject qo=new QueryObject();
        qo.setCurrentPage(currentPage);
        qo.setPageSize(pageSize);
        PageResult<Department> pageResult = departmentService.query(qo);
        model.addAttribute("pageResult",pageResult);
        return "department/list";
    }
}

 ④ html模板,访问http://localhost/department/input?id=801即可查询对应的部门信息(801为数据库中数据的id)

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>部门新增或者修改</title>
</head>
<body>
<h3>部门编辑</h3>
<form action="/department/saveOrUpdate" method="post">
    <input type="hidden" name="id" th:value="${department?.id}">
    <input type="text" name="name" placeholder="名称" th:value="${department.name}"><br/>
    <input type="text" name="sn" placeholder="缩写" th:value="${department.sn}"><br/>
    <input type="submit" value="提交">
</form>
</body>
</html>

 小结
  springboot对控制层的优化
  1.前端文件存放位置更明确
  2.不需再写扫描控制层
  3.不需再写静态资源处理
  4.不需再写MVC注解解析器
  5.thymeleaf集成优化,小改即可
  6.前端控制器不用自行配置了,路径默认为/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Platypus 一种集中式的央行数字货币方案

集中式的CBDC&#xff0c;混合使用账户模型和UTXO模型。 角色分类 中央银行&#xff1a;发行货币&#xff0c;交易验证&#xff0c;公开交易日志&#xff0c;防止双花。 不是完全受信任的&#xff0c;假定为会遵守监管要求&#xff0c;但可能会破坏交易隐私&#xff0c;即获…

C语言——字符串函数

一.前言 我们在日常写代码的过程中&#xff0c;经常会对字符串进行处理的过程。而在C语言中的<string.h>中&#xff0c;包含了众多字符串函数&#xff0c;我们可以借助这些字符串函数来对其进行各种操作。 二.strlen函数 strlen函数的作用是求出所传字符串的长度。该函…

spring-boot之shiro安全框架配置使用

shiro架构&#xff08;外部&#xff09; shiro架构(内部) 具体API操作 获取当前的用户对象 Subject currentUser SecurityUtils.getSubject();通过当前用户拿到session Session session currentUser.getSession(); session.setAttribute("someKey", "aValu…

Android 自定义坐标曲线图(二)

Android 自定义坐标曲线图_android 自定义曲线图-CSDN博客 继上一篇文章&#xff0c;点击折线图上的点&#xff0c;显示提示信息进行修改&#xff0c;之前通过回调&#xff0c;调用外部方法&#xff0c;使用popupwindow或dialog来显示&#xff0c;但是这种方法对于弹框显示的位…

SpringCloud实用篇(二)——搭建eureka服务

搭建eureka服务 搭建EurekaServer 注册eureka自己本身 1.创建项目&#xff0c;引入spring-cloud-starter-neflix-eureka-server的依赖 <!--eureka服务端--> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cl…

Windows 远程访问 Ubuntu Desktop - 虚拟网络控制台 (Virtual Network Console,VNC)

Windows 远程访问 Ubuntu Desktop - 虚拟网络控制台 [Virtual Network Console&#xff0c;VNC] References 1. Desktop Sharing 2. Desktop Sharing Preferences 勾选 允许其他人查看您的桌面 勾选 要求远程用户输入此密码 取消勾选 必须为对本机器的每次访问进行确定 3. 虚拟…

Qt 富文本处理 (字体颜色大小加粗等)

Qt中支持HTML的控件有textEdit 、label 、textBrowser 。 接口&#xff1a;setHtml("Qt"); toHtml(). 文本样式设置 : 可分字设置 &#xff0c;主要使用QTextCharFormat类进行文本样式设置。 示例&#xff1a; QTextCharFormat fmt; //粗体 fmt.setFontWeight…

Linux中常用命令(文件、目录和文件压缩)及功能示例

一、Linux关于文件与目录的常用命令及其功能示例 命令: ls 全名: List (列表) 常用选项: -l: 详细列表格式&#xff0c;显示详细信息。-a: 显示所有文件&#xff0c;包括隐藏文件。 功能: 列出目录内容。 示例: ls -la /home 此命令以详细格式列出/home目录中的所有文件&#x…

openLooKeng开发环境搭建

文章目录 搭建OpenLooKeng开发环境要求 以下是搭建OpenLooKeng开发环境的基本步骤&#xff1a;1、从OpenLooKeng的GitHub仓库克隆代码&#xff1a;2、 构建OpenLooKeng生成IntelliJ IDEA项目文件 airbase构建项目过程中出现的问题checkstyle错误版本冲突问题hetu-heuristic-ind…

java将文件转成流文件返回给前端

环境&#xff1a;jdk1.8&#xff0c;springboot2.5.3,项目端口号&#xff1a;9100 1.待转换的文件 一、路径 二、文件内容 2.controller中代码 package com.example.pdf.controller;import com.example.pdf.service.GetFileStreamService; import org.springframework.web.b…

linux离线安装jdk

一、下载jdk 地址: Java Downloads | Oracle 中国 具体下载什么版本要根据安装的linux系统架构来决定&#xff0c;是ARM64还是X64&#xff0c;linux命令行输入如下命令 uname -m 可以看到linux系统是x64 架构(x86是32位&#xff0c;x86_64是64位&#xff0c;由于x86已经淘汰&…

正弦实时数据库(SinRTDB)的使用(8)-过滤查询

前文已经将正弦实时数据库的使用进行了介绍&#xff0c;需要了解的可以先看下面的博客&#xff1a; 正弦实时数据库(SinRTDB)的安装 正弦实时数据库(SinRTDB)的使用(1)-使用数据发生器写入数据 正弦实时数据库(SinRTDB)的使用(2)-接入OPC DA的数据 正弦实时数据库(SinRTDB)…

腾讯 tendis 替代 redis linux安装使用

下载地址 Tendis存储版 点击下载 linux 解压 tar -zxvf 安装包.tgz cd 解压安装包/scripts 启动 ./start.sh 停止 ./stop.sh 详细配置 修改 /scripts tendisplus.conf # tendisplus configuration for testing # 绑定本机IIP bind 192.168.31.112 port 51002 #设…

C++ :STL中deque的原理

deque的结构类似于哈希表&#xff0c;使用一个指针数组存储固定大小的数组首地址&#xff0c;当数据分布不均匀时将指针数组内的数据进行偏移&#xff0c;桶不够用的时候会像vector一样扩容然后将之前数组中存储的指针拷贝过来&#xff0c;从原理可以看出deque的性能是非常高的…

2024年腾讯云4核8G服务器性能怎么样?价格有点便宜

腾讯云4核8G服务器价格&#xff1a;轻量4核8G12M优惠价格646元15个月、CVM S5服务器4核8G配置1437元买1年送3个月。腾讯云4核8G服务器支持多少人同时在线&#xff1f;支持30个并发数&#xff0c;可容纳日均1万IP人数访问。腾讯云百科txybk.com整理4核8G服务器支持多少人同时在线…

话题通信的python实现

一、发布者Publisher的python实现 step1&#xff1a;在scripts文件夹中创建py节点 step2&#xff1a;第一行是为了指定解释器&#xff0c;Ubuntu20.04是python3&#xff0c;比他低的版本是python。第二行是为了指定编码方式。第五行中&#xff0c;引用index.ros.org中数据类型…

E5063A是德科技E5063A网络分析仪

181/2461/8938产品概述&#xff1a; Keysight E5063A 是一款低成本网络分析仪&#xff0c;可为测试天线、电缆、滤波器和 PCB 等简单无源元件提供优化的性能和功能。Keysight E5063A 为您的企业提供价格和性能之间的最佳平衡&#xff0c;以满足您的业务和技术要求。它利用行业…

R60ABD1 呼吸心跳雷达睡眠监测模块

R60ABD1 呼吸心跳雷达睡眠监测模块 简介特征参数电气参数通讯协议说明使用步骤总结 简介 R60ABD1 雷达模块基于一发三收天线形式&#xff1a;宽波束雷达模块主要适用于置顶安装模式&#xff0c;通过算法控制一定角度范围&#xff0c;精准扫描人体全身的动作层析&#xff1b;实…

Kubernetes篇(一)— kubernetes介绍

目录 前言一、应用部署方式演变二、kubernetes简介三、kubernetes组件四、kubernetes概念 前言 本章节主要介绍应用程序在服务器上部署方式演变以及kubernetes的概念、组件和工作原理。 一、应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff…

HTLM 之 vscode 插件推荐

文章目录 vscode 插件live Serverprettiersetting 保存这个文档的更改Material Theme / Material Theme icon vscode 插件 live Server prettier setting 搜索 format default 保存这个文档的更改 cmds // mac ctrls // win Material Theme / Material Theme icon 来更换…