1. 什么是配置文件
在我们的计算机上诸如 C:/Users,C:/Windows,.config,.xml 都是配置文件,配置文件主要为了解决硬编码带来的问题。硬编码是将数据直接写在程序的源代码中,代码写死后再想改变就很麻烦。因此,将可能改变的信息放在一个集中的文件中,程序启动后读取其中的数据。
2. SpringBoot 对配置文件的支持
SpringBoot 约定配置文件应放在 resources 目录下,文件名应使用 application,格式为 .yml 或 .properties。properties 是早期的配置文件格式,也是 SpringBoot 约定的默认格式。当 yml 文件和 properties 文件共存时,properties 文件优先级更高。实际开发中应使用统一的配置文件格式,维护成本更低。
3. properties 文件格式
键值对形式,key 和 value 之间 = 分割
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
使用 @Value 注解在程序中注入配置文件中的数据。
name=li
@Value("${name}")public String name;
4. yml 文件格式
properties 文件格式中有大量冗余信息,yml 文件是一种更新型和轻量的文件格式。yml 文件采用树形结构,key 和 val 之间使用冒号加空格,空格不可省略。
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=falseusername: rootpassword: root
使用 yml 配置不同类型的单个数据。依然使用 @Value 注入数据。
example:v1: Hello #字符串不需要加引号v2: truev3: falsev4: 3.12723v5: ~ #表示nullv6: '' #表示空字符串v7: "Hello \n yml" #加双引号后该子串中的特殊字符会生效,此时会换行
使用 yml 配置对象。此时需要使用 @ConfigurationProperties 注解注入。被注入 val 的 bean 必须提供 Setter 方法,因为 Setter 方法 是 Spring 在绑定过程中通过反射调用的入口,框架会尝试将配置的键名与 Setter 方法名匹配。如果没有 Setter,Spring 无法通过反射直接修改 private 字段(即使字段是 public,也不符合封装原则)。
student:name: liage: 18hobby: # list必须依赖对象才能配置- football- boxing- runningscore: # 可以使用map获取,也可以单个获取math: 90physics: 88
@Data
@Configuration
@ConfigurationProperties("student")
public class User1 {public String name;public Integer age;public List<String> hobby;public Map<String, String> score;
}
5. SpringBoot 日志
5.1 为何要使用日志
通过日志监控系统的运行状态。
使用日志进行数据采集,推荐排序。算法人员通过分析采集的数据,训练模型,为用户做推荐。
日志一定程度上保障网络安全。比如一些内部的用户信息泄露,如果记录了日志就可以为调查提供证据。
5.2 门面模式与 SLF4J
门面模式又称为外观模式,其特征是使用一个统一的高层接口,来访问其下众多子系统中的接口,这使得每个子系统的调用都更具规范性和统一性,降低调用者的学习成本。每个子系统都不是一个单独的类,而是类的集合,子系统可以被独立使用。子系统不知道高层接口(门面)的存在,站在子系统的角度上看,门面只是另一个客户端。
即将学习的日志系统 SLF4J 就是一个门面,而不是真正的日志实现,它是为许多日志框架做出的统一规范。因此单独使用 SLF4F 是没有任何意义的,它在底层需要和真正的日志框架配合,真正的日志实现包括 log4j、JUL 和 logback,这些框架已经被封装在门面之下了。SLF4J 使我们的代码独立于任何一个特定的日志 API。
5.3 日志具体格式
日志级别:
FATAL:致命信息,说明此时系统已经一定程度上不可用,一个进程的生命周期中理论上最多出现一次 FATAL。
ERROR:错误信息,级别较高,但系统可以继续运行
WARN:警告信息,需要注意的问题
INFO:普通信息,用于记录程序正常的运行信息
DEBUG:调试信息,调试时的关键信息打印
TRACE:追踪信息,颗粒度最细的信息打印,并不常用
日志级别是开发人员自行设置的,供开发人员检测使用,并不是测试中的 Bug 级别。越高级别的日志会给开发者回馈更少的消息。
5.4 基础使用
使用 slf4j 包下的 LoggerFactory 就可以轻松创建日志对象,使用 Logger 类接收。需要传递一个参数作为日志名称,建议填入源类名以方便追踪问题所在地。
private static Logger logger = LoggerFactory.getLogger(Demo4.class);logger.info("此处为输入日志的内容...")
测试不同级别的日志:每当客户端调用该方法,该方法都会在控制台打印一次日志。日志输出的默认级别是 INFO,因此 DEBUG 和 TRACE 级别的日志不会被打印。
5.5 日志的灵活配置
使用 logging.level 配置日志输出级别,root 作用于整个项目,同级添加某个类路径以特指该类下日志输出的级别。
日志持久化。若同时配置两个配置项则以 name 为准。
随着日志文件越来越大,需要对其进行分割。默认情况下日志文件超过 10M 就会进行分割。如图为了方便演示设置文件上限为 1KB,企业开发通常设置 500M 左右,此处没有严格标准。默认情况下生成压缩文件(.gz),可以通过更改文件名格式来更改。
此时生成了普通文本文件。
日志还有诸多可以自定义的部分,比如日志打印格式,颜色等等。
lombok 为我们提供更简单的日志对象获取方法。使用 @Slf4j 注解代替手动从 LoggerFactory 取对象的操作,自动生成名为 log 的对象。
6. 单元测试
在 SpringBoot 项目需要针对某个方法进行测试时,首先使用 IDEA 自动生成测试类。
设计单元测试要求每个用例之间互相独立,互不干扰。setUp 方法在每个测试方法执行前都会执行,用于准备测试需要的环境,tearDown 方法在每个测试方法执行后都会执行,用于消除方法执行过程中产生的中间结果。
测试类中的 @SpringBootTest 注解会自动加载 Spring 的运行环境,@BeforeEach 注解声明 setUp 方法,@AfterEach 注解声明 tearDown 方法,@Test 注解声明测试方法。除此之外,测试类与普通类没有太大区别,可以在其中任意添加需要的属性,或使用 Autowired。也可以写不带 Test 注解的普通方法,用于准备不同的测试用例。
单元测试非常重要,单元测试做得越完善,后期出现问题,查找问题的成本越低。