SpringBoot
一、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 | <dependency> |
springboot-boot-starter-xxx:就是spring-boot的场景启动器
spring-boot-starter-web:帮我们导入了web模块正常运行所依赖的组件;
SpringBoot将所有的功能场景都抽取出来,做成一个个的starter (启动器),只需要在项目中引入这些starter即可,所有相关的依赖都会导入进来 , 我们要用什么功能就导入什么样的场景启动器即可 ;我们未来也可以自己自定义 starter;
依赖管理
父依赖
Springboot的pom.xml会依赖一个父项目, 主要是管理项目的资源过滤及插件!
1 | <parent> |
从这个父依赖点进去后, 会发现还有一个父依赖
1 | <parent> |
继续点进去, 这里才是真正管理SpringBoot应用里面所有依赖版本的地方,SpringBoot的版本控制中心;
我们导入依赖默认是不需要写版本;但是如果导入的包没有在依赖中管理着就需要手动配置版本了;
⭐⭐自动配置
核心流程
导入 starter,就会导入autoconfigure 包。
autoconfigure 包里面 有一个文件
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
,里面指定了所有启动要加载的自动配置类@EnableAutoConfiguration
会自动的把上面文件里面写的所有自动配置类都导入进来。xxxAutoConfiguration
是有条件注解进行按需加载xxxAutoConfiguration
给容器中导入一堆组件,组件都是从xxxProperties
中提取属性值xxxProperties
是和配置文件进行了绑定
最终效果:导入starter、修改配置文件,就能修改底层行为。
三、Yaml
yaml介绍
YAML是 “YAML Ain’t a Markup Language” (YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:”Yet Another Markup Language”(仍是一种标记语言)
这种语言以数据作为中心,而不是以标记语言为重点!
以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,我们来对比下yaml和xml
传统xml配置:
1 | <server> |
yaml配置:
1 | server: |
基本语法
说明:语法要求严格!
- 1、空格不能省略
- 2、以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
- 3、属性和值的大小写都是十分敏感的。
字面量: 普通的值[数字/布尔值/字符串]
字面量直接写在后面就可以 , 字符串默认不用加上双引号或者单引号;
1 | k: v |
注意:
“ ”
双引号,不会转义字符串里面的特殊字符 , 特殊字符会作为本身想表示的意思;比如 :name: “xiaoyu \n yu” 输出 :xiaoyu 换行 yu
‘’ 单引号,会转义特殊字符 , 特殊字符最终会变成和普通字符一样输出
比如 :name: ‘xiaoyu\n yu’ 输出 :xiayu \n yu
使用
对象/数组的用法如下:
1 | #字面量 |
使用yaml注入配置文件
yaml文件更强大的地方在于,他可以给我们的实体类直接注入匹配值!
1、编写一个实体类 Person
1 |
|
2、使用yaml配置的方式进行注入,注意区别和优势,我们编写一个yaml配置!
1 | person: |
3、使用@ConfigurationProperties(prefix = "person")
注入到类中, 此时,IDEA 提示,springboot配置注解处理器没有找到,查看文档,找到一个依赖, 并加入到SpringBoot的pom.xml中
1 | <!-- 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启 --> |
5、确认以上配置都OK之后,我们去测试类中测试一下:结果是所有的值都注入成功!
1 |
|
四、日志
介绍
SpringBoot支持多种日志框架,包括Logback、Log4j2和Java 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作为日志框架,但一般不推荐使用,因为它的性能和灵活性相对较差

日志的作用
- 发现和定位问题
- 记录用户登录日志,方便分析⽤户是正常登录还是恶意破解⽤户。
- 记录系统的操作日志,方便数据恢复和定位操作⼈。
- 记录程序的执行时间,方便为以后优化程序提供数据⽀持。
日志格式
- 默认输出格式:
- 时间和日期:毫秒级精度
- 日志级别:ERROR, WARN, INFO, DEBUG, or TRACE.
- 进程 ID
-–
: 消息分割符- 线程名: 使用[]包含
- Logger 名: 通常是产生日志的类名
- 消息: 日志记录的内容
注意: logback 没有FATAL级别,对应的是ERROR
日志级别
- ALL:所有日志。
- trace:踪迹的意思,级别最低;
- DEBUG:用于调试信息,通常用于开发和调试阶段。
- INFO:提供程序运行时的重要信息,用于指示应用程序正常运行。
- WARN:表示潜在的问题,不会导致应用程序失败,但可能需要关注。
- ERROR:表示错误事件,可能导致应用程序出现问题。
- fatal:致命的,因为代码异常导致程序退出执行的事件。
- OFF:关闭日志。

SpringBoot日志默认级别是 INFO
日志级别配置
在application.yaml
中配置
1 | # 设置日志级别为 trace |
也可根据包配置更精细的日志级别
1 | logging: |
日志使用
日志持久化
**将日志保存下来的过程就叫做持久化。**想要将日志进行持久化,只需要在文件中指定日志的存储目录或者是指定日志保存文件名,Spring Boot 就会将控制台的日志写到相应的目录或文件
1 | # 设置日志文件的文件名 |
文件归档与滚动切割
归档:每天的日志单独存到一个文档中。
切割:每个文件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 | #比如在配置文件中指定使用dev环境,我们可以通过设置不同的端口号进行测试; |
外部化配置
六、单元测试
注解
常用注解说明:
@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 生命周期监听
SpringBoot 生命周期事件
事件驱动开发