ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

【Java EE】SpringBoot 配置文件、日志和单元测试

【Java EE】SpringBoot 配置文件、日志和单元测试

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 注解的普通方法,用于准备不同的测试用例。

        单元测试非常重要,单元测试做得越完善,后期出现问题,查找问题的成本越低。

返回列表