尚硅谷springboot3核心特性-基础特性(四)
SpringApplication
自定义banner
- 类路径添加
banner.txt
或者设置spring.banner.location
指定banner文件位置 - 推荐网站:Spring Boot banner在线生成工具,制作下载英文banner.txt,修改替换banner.txt文字实现自定义,个性化启动banner-bootschool.net
自定义SpringApplication
springboot项目启动类执行SpringApplication.run()
方法其实就是内部new了一个SpringApplication
对象,然后调用了实例的run()
方法
1 | import org.springframework.boot.Banner; |
FluentBuilder API
springboot提供的链式创建SpringApplication
实例的方式
1 | new SpringApplicationBuilder() |
Profiles
环境隔离能力;快速切换开发、测试、生产环境
步骤:
- 标识环境:指定哪些组件、配置在哪个环境生效
- 切换环境:这个环境对应的所有组件和配置就应该生效
使用
指定环境
- Spring Profiles 提供一种隔离配置的方式,使其仅在特定环境生效;
- 任何
@Component
、@Configuration
或@ConfigurationProperties
都可以使用@Profiles
标记,来指定何时被加载。【容器中的组件都可以被@Profiles
标记】
环境激活
- 配置激活指定环境;配置文件
1
production,hsqldb =
- 也可以使用命令激活
--spring.profiles.active=dev,hsqldb
- 还可以配置默认环境;不标注
@Profiles
的组件永远都存在- 以前默认环境叫
default
spring.profiles.default=test
- 以前默认环境叫
- 推荐使用激活方式激活指定环境
环境包含
注意:
spring.profiles.active
和spring.profiles.default
只能用到无profile
的文件中,如果在application-dev.yml
中编写就是无效的- 也可以额外添加生效文件,而不是激活替换,比如:
1
2common =
local =
最佳实战:
- 生效环境 = 激活的环境/默认环境 + 包含的环境
- 项目里这么用
Profile配置文件
application-{profile}.properties
可以作为指定环境的配置文件- 激活这个环境,配置就会生效。最终生效的所有配置是
application.properties
:默认配置文件,任意时候都会生效application-{profile}.properties
:指定环境配置文件,激活指定环境生效
profile优先级 > application
外部化配置
场景:线上应用如何快速修改配置,并应用最新配置
- SpringBoot使用 配置优先级 + 外部配置 简化配置更新、简化运维。
- 只需要给
jar
应用所在的文件夹放一个application.properties
最新配置文件,重启项目就能自动应用最新配置- 如果使用
war
包配合tomcat,则需要放在tomcat启动脚本所在目录
配置优先级
SpringBoot允许将配置外部化,以便可以在不同的环境中使用相同的应用程序代码。
我们可以使用各种外部配置源,包括Java Properties文件
、YAML文件
、命令行参数
。@Value
可以获取值,也可以用@ConfigurationProperties
及那个所有属性绑定到java object
中。
以下是SpringBoot属性源加载顺序。 后面的会覆盖前面的值。由低到高,高优先级配置覆盖低优先级。
- 默认属性(通过
SpringApplication.setDefaultProperties()
指定的) @PropertySource
指定加载的配置(需要写在@Configuration
类上才可生效)- 配置文件(
application.properties/yml
等) RandomValuePropertySource
支持的random.*
配置(如:@Value("${random.int}")
)- OS环境变量
- Java系统属性(
System.getProperties()
) - JNDI属性(来自
java:comp/env
) ServletContext
初始化参数ServletConfig
初始化参数SPRING_APPLICATION_JSON
属性(内置环境变量或系统属性中的JSON)- 命令行参数
- 测试属性。(
@SpringBootTest
进行测试时指定的属性) - 测试类
@TestPropertySource
注解 - Devtools 设置的全局属性。(
$HOME/.config/spring-boot
)
结论:配置可以写到很多位置,常见的优先级顺序:
命令行
>配置文件
>springapplication配置
配置文件优先级如下:(后面覆盖前面)
- jar包内的
application.properties/yml
- jar包内的
application-{profile}.properties/yml
- jar包外的
application.properties/yml
- jar包外的
application-{profile}.properties/yml
建议:使用同一种格式的配置文件,如果.properties
和.yml
同时存在,则.properties
优先
结论:包外 > 包内;同级情况:
profile配置
>application配置
所有参数均可由命令行传入,使用--参数项=参数值
,将会被添加到环境变量中,并优先于配置文件
。
比如java -jar app.jar --name=Spring
,可以使用@value(${"name"})
获取
外部配置
SpringBoot应用启动时会自动寻找application.properties
和application.yml
位置,进行加载。顺序如下:(后面覆盖前面)
- 类路径:内部
- 类根路径
- 类下
/config
包
- 当前路径(项目所在的位置)
- 当前路径
- 当前下
/config
子目录 /config
目录的直接子目录
最终效果:优先级由高到低,前面的覆盖后面
- 命令行 > 包外config直接子目录 > 包外config目录 > 包外根目录 > 包内目录
- 同级比较
- profile配置 > 默认配置
- properties配置 > yml配置
规律:最外层的最优先。
- 命令行 > 所有
- 包外 > 包内
- config目录 > 根目录
- peofile > application
配置不同就都生效(互补),配置相投高优先级覆盖低优先级。
导入配置
使用spring.config.import
可以导入额外配置
1 | my.properties = |
无论以上写法的先后顺序,my.properties
的值总是优先于直接在文件中my.property
。
属性占位符
配置文件中可以使用${name.default}
形式取出之前配置过的值。
1 | MyApp = |
单元测试-JUnit5
整合
SpringBoot提供了一系列测试工具集及注解方便我们进行测试。spring-boot-test
提供核心测试能力,spring-boot-test-autoconfigure
提供测试的一些自动配置。
我们只需要导入spring-boot-starter-test
即可整合测试。
1 | <dependency> |
spring-boot-starter-test
默认提供了以下库供我们测试使用
组件测试
直接使用@Autowired
注入容器中的组件进行测试。
注解
JUnit5的注解与Junit4的注解有所变化
JUnit 5 User Guide
- @Test : 表示方法是测试方法。但是与JUnit4的
@Test
不同,他的职责非常单一不能声明任何属性,拓展的测试将会由Jupiter提供额外测试 - @ParameterizedTest : 表示方法是参数化测试,下方会有详细介绍
- @RepeatedTest : 表示方法可重复执行,下方会有详细介绍
- @DisplayName : 为测试类或者测试方法设置展示名称
- @BeforeEach : 表示在每个单元测试之前执行
- @AfterEach : 表示在每个单元测试之后执行
- @BeforeAll : 表示在所有单元测试之前执行
- @AfterAll : 表示在所有单元测试之后执行
- @Tag : 表示单元测试类别,类似于JUnit4中的
@Categories
- @Disabled : 表示测试类或测试方法不执行,类似于JUnit4中的
@Ignore
- @Timeout : 表示测试方法运行如果超过了指定时间将会返回错误
- @ExtendWith : 为测试类或测试方法提供扩展类引用
1 | import static org.junit.jupiter.api.Assertions.fail; |
断言
方法 | 说明 |
---|---|
assertEquals | 判断两个对象或两个原始类型是否相等 |
assertNotEquals | 判断两个对象或两个原始类型是否不相等 |
assertSame | 判断两个对象引用是否指向同一个对象 |
assertNotSame | 判断两个对象引用是否指向不同的对象 |
assertTrue | 判断给定的布尔值是否为 true |
assertFalse | 判断给定的布尔值是否为 false |
assertNull | 判断给定的对象引用是否为 null |
assertNotNull | 判断给定的对象引用是否不为 null |
assertArrayEquals | 数组断言 |
assertAll | 组合断言 |
assertThrows | 异常断言 |
assertTimeout | 超时断言 |
fail | 快速失败 |
嵌套测试
JUnit5可以通过Java中的内部类和
@Nested
注解实现嵌套测试,从而可以更好的把相关的测试方法组织在一起。在内部类中可以使用@BeforEach
和@AfterEach
注解,而且嵌套的层次没有限制。
1 |
|
参数化测试
参数化测试是JUnit5很重要的一个新特性,它使得用不同的参数多次运行测试成为了可能,也为我们的单元测试带来许多便利。
利用
@ValueSource
等注解,指定入参,我们将可以使用不同的参数进行多次单元测试,而不需要每新增一个参数就新增一个单元测试,省去了很多冗余代码。
- @ValueSource: 为参数化测试指定入参来源,支持八大基础类以及String类型,Class类型
- @NullSource: 表示为参数化测试提供一个null的入参
- @EnumSource: 表示为参数化测试提供一个枚举入参
- @CsvFileSource:表示读取指定CSV文件内容作为参数化测试入参
- @MethodSource:表示读取指定方法的返回值作为参数化测试入参(注意方法返回需要是一个流)
1 |
|