SpringBoot

简介

入门

  1. 创建新模块,选择spring初始化,并配置模块相关基础信息

  2. 选择当前模块需要使用的技术集

    image-20240131172435129

  3. 运行控制器类

    image-20240131172507811

  4. 运行自动生成的Application类

    image-20240131172533939

项目快速启动

  1. 对SpringBoot项目打包(执行Maven构建指令package)
  2. 执行启动指令
    1. java -jar springboot项目名.jar
    2. image-20240131175237870

概述

  1. 起步依赖

    image-20240131180913610

    image-20240131180950058

  2. SpringBoot程序启动

    1. 启动方式

      image-20240131181310239

    2. SpringBoot在创建项目时,采用jar的打包方式

    3. SpringBoot的引导类是项目的入口,运行main方法就可以启动项目。

基础配置

配置文件格式

  1. 修改服务器端口

    image-20240131200616427

  2. 配置格式: SpringBoot配置文件加载顺序:properties > yml > yaml

yaml语法规则

image-20240131201423070

yaml读取

  1. 使用@Value读取单个数据,属性名引用方式: ${一级属性名.二级属性名}

    image-20240131202709783

  2. 封装全部数据到Environment对象

    image-20240131202752946

  3. 自定义对象指定数据(常用)

    image-20240131202853982
  4. 自定义对象封装数据警告解决方案

    image-20240131203003845

多环境启动

  1. yaml配置文件

    image-20240131203737207

  2. properties文件多环境启动

    image-20240131203821701

  3. 多文件配置

    image-20240226180552439

多环境命令行启动

  1. 带参数启动SpringBoot

    1
    java -jar 项目jar名 --spring.profiles.active=test --server.port=80
  2. 环境变量方式

    image-20240226174436411

  3. 外部配置文件方式

    image-20240226174819734

多环境开发控制

  1. Maven中设置多环境属性

    image-20240201114934449

  2. SpringBoot中引用Maven属性

    image-20240201115002832

  3. 执行Maven打包指令

    image-20240201115122602

  4. 对资源文件开启对默认占位符的解析

    image-20240201115201825

配置文件分类

  1. SpringBoot中4级配置文件

    image-20240201115941029

  2. 作用:

    1. 1级与2级留作系统打包后设置通用属性
    2. 3级与4级用于系统开发阶段设置通用属性

自动配置原理

  1. 在主启动类上添加了SpringBootApplication注解,这个注解组合了EnableAutoConfiguration注解。
  2. EnableAutoConfiguration注解又组合了import注解,导入了AutoConfigurationSelector类
  3. 实现selectIpmorts方法,这个方法经过层层调用,最终会读取META-INF目录下的后缀名为imports的文件,boot2.7以前的版本,读取的是spring.factories文件。
  4. 当前到全类名之后,会解析注册条件,也就是@Conditional及其衍生注解,把满足注册条件的bean对象自动注入到IOC容器中。

自定义starter

  1. image-20240223211043881
  2. image-20240223221451652
  3. image-20240223221502954

整合第三方技术

整合JUnit

image-20240201121223557

整合Mybatis

  1. 选择当前需要使用的技术集(MyBatis、MySQL)

    image-20240201123328175

  2. 设置数据源参数

    1. image-20240201123350875
    2. image-20240201123356274
  3. 定义数据层接口与映射配置

    image-20240201123444115

动态SQL

随着用户的输入或者外部条件的变化而变化的SQL语句,称为动态SQL。

  1. :用于判断条件是否成立。使用test属性进行条件判断,如果条件为True,则拼接SQL。

  2. :where元素只会在子元素有 内容的情况下插入where子句。而且会自动去除子句的开头的and或or。

    image-20240202221502662

  3. :动态地在行首插入set关键字,并会删除额外的逗号。(用在update语句中)

  4. 循环

    image-20240202221535812

  5. SQL片段

    • :定义可重用的SQL片段
    • :通过属性refid,制动包含的SQL片段。

Mybatis分页查询

image-20240225165429735

image-20240225165437530

image-20240225170643960

image-20240225165444616

image-20240225171247759

整合Redis

  1. 导入spring-boot-starter-data-redis起步依赖。
  2. 在yml配置文件中配置Redis连接信息。
  3. 调用API(StringRedisTemplate)完成字符串的存取操作
  4. image-20240226111348004

登录优化-redis

令牌主动失效机制

  1. 登陆成功后,给浏览器响应令牌的同时,把该令牌存储到Redis中。
  2. LoginInterceptor拦截器中,需要验证拦截器携带的令牌,并同时需要获取到Redis中存储的与之相同的令牌。
  3. 当用户修改密码成功后,删除Redis存储的旧令牌。

整合knife4j接口文档

介绍

knife4j是一个集Swagger2 和 OpenAPI3为一体的增强解决方案,帮助开发者快速聚合使用OpenAPI规范,快速生成API文档,并且提供一些额外的功能,比如:

  1. API文档生成:可以根据Controller和方法上的注解自动生成Markdown格式的API文档
  2. 在线访问API:可以在knife4j的页面直接访问我们的API接口
  3. Token管理:可以在knife4j中对API Token进行管理
  4. 比较请求与响应:可以比较同一个API的请求与响应内容的差异
  5. 高亮API响应:将API响应中的JSON高亮显示,方便查看

集成knife4j

引入pom依赖(pom.xml)

1
2
3
4
5
6
<!--引入knif4j-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
<version>4.4.0</version>
</dependency>

配置文件(application.yml文件)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# springdoc-openapi项目配置,访问地址:http://127.0.0.1:8080/doc.html
springdoc:
swagger-ui:
path: /swagger-ui.html
tags-sorter: alpha
operations-sorter: alpha
api-docs:
path: /v3/api-docs
group-configs:
- group: 'default'
paths-to-match: '/**'
packages-to-scan: com.example.backend

# knife4j的增强配置,不需要增强可以不配
knife4j:
enable: true
setting:
language: zh_cn

swagger初始化配置(在config目录下配置文件)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.example.backend.config;

import io.swagger.v3.oas.models.ExternalDocumentation;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


/**
* 自定义 Swagger 接口文档的配置
* @author wang
*/
@Configuration
public class SwaggerConfig {

@Bean
public OpenAPI springShopOpenAPI() {
return new OpenAPI()
.info(new Info().title("伙伴匹配系统")
.description("伙伴匹配系统API文档")
.version("v1")
.license(new License().name("Apache 2.0").url("http://springdoc.org")))
.externalDocs(new ExternalDocumentation()
.description("外部文档")
.url("https://springshop.wiki.github.org/docs"));
}

}

常用注解

image-20240724174545895

JWT

  1. 定义:用于通信双方以JSON数据格式安全的传输信息。
  2. 组成:
    1. Header(头),记录令牌类型,签名算法等
    2. payload(有效载荷),携带一些自定义信息,默认信息等。
    3. Signature(签名),防止Tokenveil篡改,确保安全性。将header,payload并加入指定秘钥,通过指定签名算法而来
  3. image-20240224151537782
  1. JWT-生成
    1. image-20240224151752591
    2. image-20240224151758810
  2. JWT—-验证
    1. image-20240224161744450
    2. image-20240224161801059

文件上传阿里云OSS

  1. image-20240225203344849
  2. image-20240225203352802

上传到本地磁盘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>/**
* 上传文件到本地磁盘中
* @param file
* @return
* @throws IOException
*/
@PostMapping("/upload")
public Result<String> upload(MultipartFile file) throws IOException {
// 获取文件的原始名
String originalFilename = file.getOriginalFilename();
// 使用UUID输出的随机字符串拼接文件后缀得到新文件名,防止文件名相同时会被覆盖
String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
// 上传到本地
file.transferTo(new File("D:\\video素材\\file\\"+fileName));
return Result.success("上传文件地址……");
}

上传到阿里云OSS服务器中

  1. 创建建阿里云bucket仓库
  2. 获取accessKeyId和SecretAccessKey
  3. 引入阿里云Maven坐标
  4. 使用AliOSSUtils工具类
  5. 传入通过UUID修改后的filename,和inputStream流即可。

参数校验

普通参数校验

  1. 使用spring Validation,对注册接口的参数进行合法性校验。
  2. 步骤
    1. 引入spring Validation起步依赖
    2. 在参数前面添加@Pattern注解
    3. 在Controller类上添加@Validated注解
    4. image-20240224141458674

实体参数校验

  1. image-20240224201054846
  2. image-20240224201102200
  3. image-20240224201107939

URL路径参数校验

  1. @URL
  2. 作用:校验参数是否URL地址

分组校验

把校验项进行归类分组,在完成不同的功能的时候,校验指定组中的校验项

  1. 定义分组-在实体类内部定义接口
  2. 定义校验项是指定归属的分组-通过groups属性指定。
  3. 校验时指定要校验的分组-给@Validated注解的value属性赋值
  4. image-20240225135947586
  5. 注意事项:
    1. 如果某个校验项没有指定分组,默认属于Default分组
    2. 分组之间可以继承,A extends B,那么A中拥有B中所有的校验项。

自定义校验

已有的注解不能满足所有的校验需求,特殊的情况需要自定义校验(自定义校验注解)

  1. 自定义注解State
  2. 自定义校验数据的类StateValidation实现ConstraintValidator接口
  3. 在需要校验的地方使用自定义注解。
  4. image-20240225151942747

失败异常处理

全局异常处理器

image-20240224142306569

拦截器

  1. image-20240224164520774
  2. image-20240224164539239

ThreadLocal

提供线程局部变量

  1. 用来存取数据: set()/get()
  2. 使用ThreadLocal存储的数据,线程安全。
  3. 用完需要调用remove方法释放,防止内存泄漏。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.util.HashMap;
import java.util.Map;

/**
* ThreadLocal 工具类
*/
@SuppressWarnings("all")
public class ThreadLocalUtil {
//提供ThreadLocal对象,
private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();

//根据键获取值
public static <T> T get(){
return (T) THREAD_LOCAL.get();
}

//存储键值对
public static void set(Object value){
THREAD_LOCAL.set(value);
}


//清除ThreadLocal 防止内存泄漏
public static void remove(){
THREAD_LOCAL.remove();
}
}

Spring Cache

  1. Spring Cache是一个框架,实现了基于注解的缓存功能,只需简单地加一个注解,就能实现缓存功能。
  2. Spring Cache提供了一层抽象,底层 可以切换不同的缓存实现,例如:RHCache,Caffeine,Redisimage-20240302152437711
  3. 常用注解image-20240302152521267

Spring Task

Spring Task介绍

  1. Spring Task是Spring框架提供任务调度工具,可以按照约定的数据自动执行某个代码逻辑。
  2. 定位:定时任务框架
  3. 作用:定时自动执行某段java代码
  4. 应用场景
    1. 信用卡每月还款提醒
    2. 银行贷款每月还款提醒
  5. cron表达式
    1. cron表达式其实就是一个字符串,通过cron表达式可以定义任务触发的时间
    2. 构成规则:分为6或7个与,有空格分隔开,每个域代表一个含义
    3. 每个域的含义分别为:秒,分钟,小时,日,月,周,年(可选)
    4. image-20240302152738531
  6. 2022年10月12日上午9点整对应的cron表达式为:0 0 9 12 10 ? 2022
  7. Spring Task使用步骤
    1. 导入Maven坐标spring-context(已存在)
    2. 启动类添加注解@EnableScheduling开启任务调度
    3. 自定义定时任务类

跨域解决

后端解决

浏览器出于安全的考虑,使用 XMLHttpRequest 对象发起HTTP请求时必须遵守同源策略,否则就是跨域的HTTP请求,默认情况下是被禁止的。 同源策略要求源相同才能正常进行通信,即协议、域名、端口号都完全一致。 前后端分离项目,前端项目和后端项目一般都不是同源的,所以肯定会存在跨域请求的问题。
开启SpringBoot的允许跨域访问。在 config 目录新建 CorsConfig 类,写入如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Configuration
public class CorsConfig implements WebMvcConfigurer {

@Override
//重写spring提供的WebMvcConfigurer接口的addCorsMappings方法
public void addCorsMappings(CorsRegistry registry) {
// 设置允许跨域的路径
registry.addMapping("/**")
// 设置允许跨域请求的域名
.allowedOriginPatterns("*")
// 是否允许cookie
.allowCredentials(true)
// 设置允许的请求方式
.allowedMethods("GET", "POST", "DELETE", "PUT")
// 设置允许的header属性
.allowedHeaders("*")
// 跨域允许时间
.maxAge(3600);
}
}

前端解决

  1. 由于浏览器的同源策略限制,向不同源(不同协议,不同域名,不同端口)发送Ajax请求会失败。
  2. 前端解决-配置代理:image-20240228174453238

项目部署

  1. 引入打包依赖
    1. image-20240226171326258
  2. 打jar包-执行package命令
  3. 运行jar包-执行java -jar jar包位置
  4. jar包部署对服务器的要求-jre环境

其他

  1. @JsonIgnore
  2. 作用:让SpringMVC把当前对象转换成JSON字符串的时候,忽略其,如(password),最终的JSON字符串中就没有password这个属性了。
  1. 配置文件开启驼峰命名
  2. 作用:当数据库字段的名称有下划线时可以匹配程序中以驼峰命名的字段。
  1. @RequsetHeader(name=”Authorization” ) String token
  2. 作用:可以从Token中通过Jwt解析获取用户名,再根据用户名查询该用户.
  1. @JsonFormat

  2. 作用:用来表示json序列化的一种格式或者类型

  3. 例如

  4.   @JsonFormat(shape =JsonFormat.Shape.STRING,pattern ="yyyy-MM-dd HH:mm:ss",timezone ="GMT+8")
          private LocalDate createTime;
    

@SpringBootTest

  1. 如果测试类上添加了这个注解,那么将来单元参数方法执行之前,回显初始化spring容器。
  2. 因此想要使用IOC容器中的bean对象时,依赖注入即可