SpringBoot中本地测试、热部署工具以及日志的配置和使用
4. 本地测试
往往在开发过程中业务代码课程非常复杂频繁启动服务器测试,非常麻烦!这个时候使用本地测试就是一个很好的解决方案,springboot也提供了本地测试解决方案!
在使用本地测试之前每次测试都得先启动springboot应用,然后再在地址栏输入方法地址,但是使用本地测试后可以直接在idea运行方法,不用事先启动springboot工厂,其本质是类在实例化的过程中会自动启动工厂,然后就调用方法。
# spring中本地测试1. 启动工厂ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");2. 从工厂中获取对象UserDAO userDAO = context.getBean("userDAO");3. 调用方法userDAO.xxx(参数);# springboot框架中完成本地测试springboot = spring + springmvc1. 引入结合junit和springboot依赖2. 启动springboot应用spring工厂才能启动注入测试对象@SpringBootTest修饰范围:用在类上作用: 在这个类实例化的过程中启动springboot应用
- 在pom.xml中引入测试依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope></dependency>
- 编写测试类
测试类应该写在src/test及其子包下
@SpringBootTest
- 修饰范围: 用在类上
- 作用: 用来启动本地Spring环境
@SpringBootTestpublic class UserServiceTest { @Autowired private UserService userService; // 测试查询所有 @Test public void testFindAll(){ userService.findAll().forEach(user -> System.out.println(user.getName())); }}
补充
如果不想使用@SpringBootTest也能在实例化类的时候启动工厂,可以创建一个基类,让该基类使用@SpringBootTest注解,然后创建测试类的时候让测试类继承基类,这样在要想实例化测试类,需要先实例化作为父类的基类,基类一旦实例化则工厂就启动了。
基类BasicTests
@SpringBootTestpublic class BasicTests {}
测试类
测试Service
// 让测试类继承基类public class UserServiceTest extends BasicTests{ @Autowired private UserService userService;// 测试谁就注入谁 // 测试查询所有 @Test public void testFindAll(){ userService.findAll().forEach(user -> System.out.println(user.getName())); }}
测试DAO
public class UserDAOTests extends BasicTests{ @Autowired private UserDAO userDAO; @Test public void testFindAll(){ userDAO.findAll().forEach(user -> System.out.println(user.getName())); }}
5. 热部署工具
热部署:不需要重启应用的情况下使修改生效
为了进一步提高开发效率,springboot为我们提供了全局项目热部署,日后在开发过程中修改了部分代码以及相关配置文件后,不需要每次重启使修改生效,在项目中开启了springboot全局热部署之后只需要在修改之后等待几秒即可使修改生效。
- 项目中引入依赖(关于热部署的依赖)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional></dependency>
- 设置idea中支持自动编译(只需要设置一次)
- 开启允许在运行过程中修改文件
下面的是2021版的idea中的设置
- 启动SpringBoot应用
注意:日志出现restartedMain代表已经生效,在使用热部署时如果遇到修改之后不能生效,请重试重启项目再试
6. 日志配置和使用
6.1 引言
springboot框架 集成logback日志
Logback日志是由log4j创始人设计的又一个开源日志组件。目前,logback分为三个模块:logback-core、logback-classic、 logback-access。是对log4j日志展示进一步改进!
总结:logback 也是一个开源日志组件 和 log4j作用一致 都是用来生成日志 logback更加轻量
6.2 日志的级别
All > Trace >
DEBUG > INFO > WARN > ERROR
> Fatal > OFF
- OFF | 关闭:最低级别,不打印日志。
- FATAL | 致命:指明非常严重的可能会导致应用终止执行错误事件。
- ERROR | 错误:指明错误事件,但应用可能还能继续运行。
- WARN | 警告:指明可能潜在的危险状况。
- INFO | 信息:指明描述信息,从粗粒度上描述了应用运行过程。
- DEBUG | 调试:指明细致的事件信息,对调试应用最有用。
- TRACE | 跟踪:指明程序运行轨迹,比DEBUG级别的粒度更细。
- ALL | 所有:所有日志级别,包括定制级别。
我们自己写的代码用的最多的是 DEBUG、INFO、WARN、ERROR这几个级别。如果需要做一些调试,就用DEBUG;如果想做一些基本的信息输出,就用INFO;如果觉得自己写的代码存在潜在风险,就用WARN;如果自己写的代码日后可能会出现错误,就用ERROR级别。
日志级别由低到高:
日志级别越高输出的日志信息越多
6.3 项目中日志分类
# 日志分类- 一种是rootLogger(根全局日志) :用来监听项目中所有的运行日志 包括引入依赖jar中的日志- 一种是logger(指定包级别日志) :用来监听项目中指定包中的日志信息
6.4 配置日志
注意:SpringBoot框架中默认根日志为INFO
当我们想要修改根日志的级别和子日志的级别时我们可以在application.yml配置文件中配置,如下
# 配置日志 根日志是唯一的,只能写一个。但子日志可以写多个,可以监测任何包logging: level: root: info # 调整根(全局)日志展示为debug com.baizhi.dao: debug # 设置指定包的日志级别 com.baizhi.service: debug
有时候我们不仅想使日志在控制台输出,还想使它打印成文件,我们可以这样配置
6.5 项目中使用日志
package com.baizhi.service;import com.baizhi.dao.UserDAO;import com.baizhi.eneity.User;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import java.util.List;@Service@Transactionalpublic class UserServiceImpl implements UserService{ // 声明一个日志对象 private static final Logger log = LoggerFactory.getLogger(UserService.class); private UserDAO userDAO; @Autowired public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } @Override public List<User> findAll() { return userDAO.findAll(); } @Override public void save(User user) { log.debug("姓名:" + user.getName()); // log.debug("姓名:{}, {}, {}",user.getName(),"参数2","参数3"); log.debug("工资:" + user.getSalary()); // log.debug("姓名:{}==>{}==>{}",user.getSalary(),"参数2","参数3"); log.debug("生日:" + user.getBirthday()); userDAO.save(user); }}
注意点1:
注意点2:
日志对象不仅可以用在service,还可以用在dao、controller层等等。
补充:使用插件使我们想要使用日志对象进行调试时不用声明日志对象
使用插件可以使我们不用每次都得声明日志对象,那怎么配置呢,我们往下看
插件使用