一、SpringBoot介绍

什么是SpringBoot

什么是SpringBoot呢,就是一个javaweb的开发框架,和SpringMVC类似,对比其他javaweb框架的好处,官方说是简化开发,约定大于配置you can "just run",能迅速的开发web应用,几行代码开发一个http接口。

Spring Boot 基于 Spring 开发,Spirng Boot 本身并不提供 Spring 框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序。Spring Boot 以约定大于配置的核心思想,默认帮我们进行了很多设置,多数 Spring Boot 应用只需要很少的 Spring 配置。同时它集成了大量常用的第三方库配置(例如 Redis、MongoDB、Jpa、RabbitMQ、Quartz 等等),Spring Boot 应用中这些第三方库几乎可以零配置的开箱即用

SpringBoot的优点

Spring Boot的主要优点:

  • 快速创建独立 Spring 应用
  • 开箱即用,提供各种默认配置来简化项目配置
  • 内嵌式容器简化Web项目
  • 没有冗余代码生成和XML配置的要求
  • 提供生产级特性:如 监控指标、健康检查、外部化配置等

总结:

简化开发,简化配置,简化整合,简化部署,简化监控,简化运维

彩蛋

SpringBoot启动程序时, 图案

如何更改启动时显示的字符拼成的字母,SpringBoot呢?也就是 banner 图案;

只需一步:到项目下的 resources 目录下新建一个banner.txt 即可。

图案可以到:https://www.bootschool.net/ascii 这个网站生成,然后拷贝到文件中即可!

二、⭐SpringBoot自动配置原理

场景启动器

1
2
3
4
<dependency>    
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

springboot-boot-starter-xxx:就是spring-boot的场景启动器

spring-boot-starter-web:帮我们导入了web模块正常运行所依赖的组件;

SpringBoot将所有的功能场景都抽取出来,做成一个个的starter (启动器),只需要在项目中引入这些starter即可,所有相关的依赖都会导入进来 , 我们要用什么功能就导入什么样的场景启动器即可 ;我们未来也可以自己自定义 starter;

依赖管理

父依赖

Springboot的pom.xml会依赖一个父项目, 主要是管理项目的资源过滤及插件!

1
2
3
4
5
6
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

从这个父依赖点进去后, 会发现还有一个父依赖

1
2
3
4
5
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.3.3</version>
</parent>

继续点进去, 这里才是真正管理SpringBoot应用里面所有依赖版本的地方,SpringBoot的版本控制中心

我们导入依赖默认是不需要写版本;但是如果导入的包没有在依赖中管理着就需要手动配置版本了;

image-20240909202842952

⭐⭐自动配置

核心流程

  1. 导入 starter,就会导入autoconfigure 包。

  2. autoconfigure 包里面 有一个文件

    META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,里面指定了所有启动要加载的自动配置类

  3. @EnableAutoConfiguration 会自动的把上面文件里面写的所有自动配置类都导入进来。xxxAutoConfiguration 是有条件注解进行按需加载

  4. xxxAutoConfiguration 给容器中导入一堆组件,组件都是从 xxxProperties 中提取属性值

  5. xxxProperties 是和配置文件进行了绑定

最终效果:导入starter、修改配置文件,就能修改底层行为。

image-20240909211222339

三、Yaml

yaml介绍

YAML是 “YAML Ain’t a Markup Language” (YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:”Yet Another Markup Language”(仍是一种标记语言)

这种语言以数据作为中心,而不是以标记语言为重点!

以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,我们来对比下yaml和xml

传统xml配置:

1
2
3
<server>
<port>8081<port>
</server>

yaml配置:

1
2
server:  
prot: 8080

基本语法

说明:语法要求严格!

  • 1、空格不能省略
  • 2、以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
  • 3、属性和值的大小写都是十分敏感的。

字面量: 普通的值[数字/布尔值/字符串]

字面量直接写在后面就可以 , 字符串默认不用加上双引号或者单引号;

1
k: v

注意:

  • “ ” 双引号,不会转义字符串里面的特殊字符 , 特殊字符会作为本身想表示的意思;

    比如 :name: “xiaoyu \n yu” 输出 :xiaoyu 换行 yu

  • ‘’ 单引号,会转义特殊字符 , 特殊字符最终会变成和普通字符一样输出

    比如 :name: ‘xiaoyu\n yu’ 输出 :xiayu \n yu

使用

对象/数组的用法如下:

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
#字面量
key: value

#对象/Map格式
#对象、Map格式
k:
v1:
v2:

#对象用法
student:
name: xiaoyu
age: 3

#对象的行内写法
student: {name: smith, age: 3}

#数组
pets:
- cat
- dog
- pig

#数组的行内写法
pets: [cat, dog, pig]

使用yaml注入配置文件

yaml文件更强大的地方在于,他可以给我们的实体类直接注入匹配值!

1、编写一个实体类 Person

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

/*
@ConfigurationProperties作用:
将配置文件中配置的每一个属性的值,映射到这个组件中;
告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {

private String name;
private int age;
private Boolean happy;
private Date date;
private List<Object> list;
private Map<String, Object> map;
}

2、使用yaml配置的方式进行注入,注意区别和优势,我们编写一个yaml配置!

1
2
3
4
5
6
7
8
9
10
11
12
person:
name: 小鱼
age: 22
happy: true
date: 2022/9/1
list:
- code
- music
- girl
map:
k1: hello
k2: 你好

3、使用@ConfigurationProperties(prefix = "person") 注入到类中, 此时,IDEA 提示,springboot配置注解处理器没有找到,查看文档,找到一个依赖, 并加入到SpringBoot的pom.xml中

1
2
3
4
5
6
<!-- 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

5、确认以上配置都OK之后,我们去测试类中测试一下:结果是所有的值都注入成功!

1
2
3
4
5
6
7
8
9
10
@SpringBootTest
class Springboot02ConfigApplicationTests {
@Autowired //将注册的对象 自动注入进来
private Person person;

@Test
void contextLoads() {
System.out.println(person);
}
}

四、日志

介绍

SpringBoot支持多种日志框架,包括Logback、Log4j2Java Util Logging(JUL)。默认情况下,如果你使用SpringBoot的starters启动器,它将使用Logback作为日志框架。

  • Logback:Logback是SpringBoot默认的日志框架,它是Log4j的继任者,提供了更好的性能和可靠性。你可以通过在资源目录下创建一个logback-spring.xml文件来配置Logback。
  • Log4j2:Log4j2是Log4j的升级版,它在性能和功能上都有所提升,支持异步日志和插件机制。如果你想在SpringBoot中使用Log4j2,你需要添加相应的依赖并在配置文件中指定Log4j2作为日志框架。
  • Java Util Logging(JUL):JUL是Java SE的默认日志框架,SpringBoot可以配置使用JUL作为日志框架,但一般不推荐使用,因为它的性能和灵活性相对较差
image-20240909213144269

日志的作用

  • 发现和定位问题
  • 记录用户登录日志,方便分析⽤户是正常登录还是恶意破解⽤户。
  • 记录系统的操作日志,方便数据恢复和定位操作⼈。
  • 记录程序的执行时间,方便为以后优化程序提供数据⽀持。

日志格式

  • 默认输出格式:
    • 时间和日期:毫秒级精度
    • 日志级别:ERROR, WARN, INFO, DEBUG, or TRACE.
    • 进程 ID
    • -–: 消息分割符
    • 线程名: 使用[]包含
    • Logger 名: 通常是产生日志的类名
    • 消息: 日志记录的内容

注意: logback 没有FATAL级别,对应的是ERROR

image-20240910092554265

日志级别

  • ALL:所有日志。
  • trace:踪迹的意思,级别最低;
  • DEBUG:用于调试信息,通常用于开发和调试阶段。
  • INFO:提供程序运行时的重要信息,用于指示应用程序正常运行。
  • WARN:表示潜在的问题,不会导致应用程序失败,但可能需要关注。
  • ERROR:表示错误事件,可能导致应用程序出现问题。
  • fatal:致命的,因为代码异常导致程序退出执行的事件。
  • OFF:关闭日志。
image-20240910092507581

SpringBoot日志默认级别是 INFO

日志级别配置

application.yaml中配置

1
2
3
4
# 设置日志级别为 trace
logging:
level:
root: trace

也可根据包配置更精细的日志级别

1
2
3
4
5
6
logging:
level:
root: info
com:
xiaoyu:
controller: debug

日志使用

日志持久化

**将日志保存下来的过程就叫做持久化。**想要将日志进行持久化,只需要在文件中指定日志的存储目录或者是指定日志保存文件名,Spring Boot 就会将控制台的日志写到相应的目录或文件

1
2
3
4
# 设置日志文件的文件名
logging:
file:
name: C:\tmp\yyh.log

文件归档与滚动切割

归档:每天的日志单独存到一个文档中。

切割:每个文件10MB,超过大小切割成另外一个文件。默认滚动切割与归档规则如下:

配置项 描述
logging.logback.rollingpolicy.file-name-pattern 日志存档的文件名格式 默认值:${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
logging.logback.rollingpolicy.clean-history-on-start 应用启动时是否清除以前存档;默认值:false
logging.logback.rollingpolicy.max-file-size 每个日志文件的最大大小;默认值:10MB
logging.logback.rollingpolicy.total-size-cap 日志文件被删除之前,可以容纳的最大大小(默认值:0B)。设置1GB则磁盘存储超过 1GB 日志后就会删除旧日志文件
logging.logback.rollingpolicy.max-history 日志文件保存的最大天数;默认值:7

自定义日志配置

日志系统 自定义
Logback logback-spring.xml / logback.xml
Log4j2 log4j2-spring.xml / log4j2.xml
JDK (Java Util Logging) logging.properties

五、多环境配置

profile是Spring对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境

多配置文件

我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml , 用来指定多个环境版本;

例如:

  • pplication-test.yaml代表测试环境配置

  • application-dev.yaml 代表开发环境配置

  • application-prod.yaml 代表生产环境配置

但是Springboot并不会直接启动这些配置文件,它默认使用application.yaml主配置文件

我们需要通过一个配置来选择需要激活的环境:

1
2
3
4
5
#比如在配置文件中指定使用dev环境,我们可以通过设置不同的端口号进行测试;
#我们启动SpringBoot,就可以看到已经切换到dev下的配置了;
spring:
profiles:
active: prod

外部化配置

image-20240910211612540

六、单元测试

注解

常用注解说明:

  • @Test :表示方法是测试方法。
  • @DisplayName :为测试类或者测试方法设置展示名称
  • @BeforeEach :表示在每个单元测试之前执行
  • @AfterEach :表示在每个单元测试之后执行
  • @BeforeAll :表示在所有单元测试之前执行
  • @AfterAll :表示在所有单元测试之后执行

断言

方法 说明
assertEquals 判断两个对象或两个原始类型是否相等
assertNotEquals 判断两个对象或两个原始类型是否不相等
assertSame 判断两个对象引用是否指向同一个对象
assertNotSame 判断两个对象引用是否指向不同的对象
assertTrue 判断给定的布尔值是否为 true
assertFalse 判断给定的布尔值是否为 false
assertNull 判断给定的对象引用是否为 null
assertNotNull 判断给定的对象引用是否不为 null
assertArrayEquals 数组断言
assertAll 组合断言
assertThrows 异常断言
assertTimeout 超时断言
fail 快速失败

七、SpringBoot核心原理

SpringBoot 生命周期监听

image-20240910211833658

SpringBoot 生命周期事件

image-20240910211843105

事件驱动开发

image-20240910211924657

SpringBoot 启动流程

image-20240909170744352

SpringBoot 自动装配原理

image-20240910211945316