SpringBoot
SpringBoot
Huang_Chun简介
入门
创建新模块,选择spring初始化,并配置模块相关基础信息
选择当前模块需要使用的技术集
运行控制器类
运行自动生成的Application类
项目快速启动
- 对SpringBoot项目打包(执行Maven构建指令package)
- 执行启动指令
- java -jar springboot项目名.jar
概述
起步依赖
SpringBoot程序启动
启动方式
SpringBoot在创建项目时,采用jar的打包方式
SpringBoot的引导类是项目的入口,运行main方法就可以启动项目。
基础配置
配置文件格式
修改服务器端口
配置格式: SpringBoot配置文件加载顺序:properties > yml > yaml
yaml语法规则
yaml读取
使用@Value读取单个数据,属性名引用方式: ${一级属性名.二级属性名}
封装全部数据到Environment对象
自定义对象指定数据(常用)
自定义对象封装数据警告解决方案
多环境启动
yaml配置文件
properties文件多环境启动
多文件配置
多环境命令行启动
带参数启动SpringBoot
1 java -jar 项目jar名 --spring.profiles.active=test --server.port=80环境变量方式
外部配置文件方式
多环境开发控制
Maven中设置多环境属性
SpringBoot中引用Maven属性
执行Maven打包指令
对资源文件开启对默认占位符的解析
配置文件分类
SpringBoot中4级配置文件
作用:
- 1级与2级留作系统打包后设置通用属性
- 3级与4级用于系统开发阶段设置通用属性
自动配置原理
- 在主启动类上添加了SpringBootApplication注解,这个注解组合了EnableAutoConfiguration注解。
- EnableAutoConfiguration注解又组合了import注解,导入了AutoConfigurationSelector类
- 实现selectIpmorts方法,这个方法经过层层调用,最终会读取META-INF目录下的后缀名为imports的文件,boot2.7以前的版本,读取的是spring.factories文件。
- 当前到全类名之后,会解析注册条件,也就是@Conditional及其衍生注解,把满足注册条件的bean对象自动注入到IOC容器中。
自定义starter
整合第三方技术
整合JUnit
整合Mybatis
选择当前需要使用的技术集(MyBatis、MySQL)
设置数据源参数
定义数据层接口与映射配置
动态SQL
随着用户的输入或者外部条件的变化而变化的SQL语句,称为动态SQL。
:用于判断条件是否成立。使用test属性进行条件判断,如果条件为True,则拼接SQL。
:where元素只会在子元素有 内容的情况下插入where子句。而且会自动去除子句的开头的and或or。
:动态地在行首插入set关键字,并会删除额外的逗号。(用在update语句中)
循环 SQL片段
:定义可重用的SQL片段 :通过属性refid,制动包含的SQL片段。
Mybatis分页查询
整合Redis
- 导入spring-boot-starter-data-redis起步依赖。
- 在yml配置文件中配置Redis连接信息。
- 调用API(StringRedisTemplate)完成字符串的存取操作
登录优化-redis
令牌主动失效机制
- 登陆成功后,给浏览器响应令牌的同时,把该令牌存储到Redis中。
- LoginInterceptor拦截器中,需要验证拦截器携带的令牌,并同时需要获取到Redis中存储的与之相同的令牌。
- 当用户修改密码成功后,删除Redis存储的旧令牌。
整合knife4j接口文档
介绍
knife4j是一个集Swagger2 和 OpenAPI3为一体的增强解决方案,帮助开发者快速聚合使用OpenAPI规范,快速生成API文档,并且提供一些额外的功能,比如:
- API文档生成:可以根据Controller和方法上的注解自动生成Markdown格式的API文档
- 在线访问API:可以在knife4j的页面直接访问我们的API接口
- Token管理:可以在knife4j中对API Token进行管理
- 比较请求与响应:可以比较同一个API的请求与响应内容的差异
- 高亮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_cnswagger初始化配置(在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
*/
public class SwaggerConfig {
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"));
}
}常用注解
JWT
- 定义:用于通信双方以JSON数据格式安全的传输信息。
- 组成:
- Header(头),记录令牌类型,签名算法等
- payload(有效载荷),携带一些自定义信息,默认信息等。
- Signature(签名),防止Tokenveil篡改,确保安全性。将header,payload并加入指定秘钥,通过指定签名算法而来
- JWT-生成
- JWT—-验证
文件上传阿里云OSS
上传到本地磁盘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 >/**
* 上传文件到本地磁盘中
* @param file
* @return
* @throws IOException
*/
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服务器中
- 创建建阿里云bucket仓库
- 获取accessKeyId和SecretAccessKey
- 引入阿里云Maven坐标
- 使用AliOSSUtils工具类
- 传入通过UUID修改后的filename,和inputStream流即可。
参数校验
普通参数校验
- 使用spring Validation,对注册接口的参数进行合法性校验。
- 步骤
- 引入spring Validation起步依赖
- 在参数前面添加
@Pattern
注解- 在Controller类上添加
@Validated
注解
实体参数校验
URL路径参数校验
- @URL
- 作用:校验参数是否URL地址
分组校验
把校验项进行归类分组,在完成不同的功能的时候,校验指定组中的校验项
- 定义分组-在实体类内部定义接口
- 定义校验项是指定归属的分组-通过groups属性指定。
- 校验时指定要校验的分组-给@Validated注解的value属性赋值
- 注意事项:
- 如果某个校验项没有指定分组,默认属于Default分组
- 分组之间可以继承,A extends B,那么A中拥有B中所有的校验项。
自定义校验
已有的注解不能满足所有的校验需求,特殊的情况需要自定义校验(自定义校验注解)
- 自定义注解State
- 自定义校验数据的类StateValidation实现ConstraintValidator接口
- 在需要校验的地方使用自定义注解。
失败异常处理
全局异常处理器
拦截器
ThreadLocal
提供线程局部变量
- 用来存取数据: set()/get()
- 使用ThreadLocal存储的数据,线程安全。
- 用完需要调用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 工具类
*/
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
- Spring Cache是一个框架,实现了基于注解的缓存功能,只需简单地加一个注解,就能实现缓存功能。
- Spring Cache提供了一层抽象,底层 可以切换不同的缓存实现,例如:RHCache,Caffeine,Redis
- 常用注解
Spring Task
Spring Task介绍
- Spring Task是Spring框架提供任务调度工具,可以按照约定的数据自动执行某个代码逻辑。
- 定位:定时任务框架
- 作用:定时自动执行某段java代码
- 应用场景
- 信用卡每月还款提醒
- 银行贷款每月还款提醒
- cron表达式
- cron表达式其实就是一个字符串,通过cron表达式可以定义任务触发的时间
- 构成规则:分为6或7个与,有空格分隔开,每个域代表一个含义
- 每个域的含义分别为:秒,分钟,小时,日,月,周,年(可选)
- 2022年10月12日上午9点整对应的cron表达式为:0 0 9 12 10 ? 2022
- Spring Task使用步骤
- 导入Maven坐标
spring-context
(已存在)- 启动类添加注解
@EnableScheduling
开启任务调度- 自定义定时任务类
跨域解决
后端解决
浏览器出于安全的考虑,使用 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
public class CorsConfig implements WebMvcConfigurer {
//重写spring提供的WebMvcConfigurer接口的addCorsMappings方法
public void addCorsMappings(CorsRegistry registry) {
// 设置允许跨域的路径
registry.addMapping("/**")
// 设置允许跨域请求的域名
.allowedOriginPatterns("*")
// 是否允许cookie
.allowCredentials(true)
// 设置允许的请求方式
.allowedMethods("GET", "POST", "DELETE", "PUT")
// 设置允许的header属性
.allowedHeaders("*")
// 跨域允许时间
.maxAge(3600);
}
}
前端解决
- 由于浏览器的同源策略限制,向不同源(不同协议,不同域名,不同端口)发送Ajax请求会失败。
- 前端解决-配置代理:
项目部署
- 引入打包依赖
- 打jar包-执行
package
命令- 运行jar包-执行
java -jar jar包位置
- jar包部署对服务器的要求
-jre
环境
其他
- @JsonIgnore
- 作用:让SpringMVC把当前对象转换成JSON字符串的时候,忽略其,如(password),最终的JSON字符串中就没有password这个属性了。
- 配置文件开启驼峰命名
- 作用:当数据库字段的名称有下划线时可以匹配程序中以驼峰命名的字段。
- @RequsetHeader(name=”Authorization” ) String token
- 作用:可以从Token中通过Jwt解析获取用户名,再根据用户名查询该用户.
@JsonFormat
作用:用来表示json序列化的一种格式或者类型
例如
@JsonFormat(shape =JsonFormat.Shape.STRING,pattern ="yyyy-MM-dd HH:mm:ss",timezone ="GMT+8") private LocalDate createTime;
@SpringBootTest
- 如果测试类上添加了这个注解,那么将来单元参数方法执行之前,回显初始化spring容器。
- 因此想要使用IOC容器中的bean对象时,依赖注入即可