SpringBoot之CommandLineRunner
应用场景:需求需要提前将部分数据加载到Spring容器中。我们需要在项目启动完立即初始化一些数据(比如缓存等),以便后面调用使用
解决方案:
1、定义静态常量
,随着类的生命周期加载而提前加载(这种方式可能对于工作经验较少的伙伴,选择是最多的);
2、实现CommandLineRunner接口
;容器启动之后,加载实现类的逻辑资源,已达到完成资源初始化的任务,不同的 CommandLineRunner 实现可以通过 @Order() 指定执行顺序;
3、@PostConstruct
;在具体Bean的实例化过程中执行,@PostConstruct注解的方法,会在构造方法之后执行;
加载顺序为:Constructor > @Autowired > @PostConstruct > 静态方法;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class InitStarter implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println("CommandLineRunner example start");
}
}
SpringBoot定时任务
创建一个定时器的配置类
package com.zsq.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import java.time.LocalDateTime;
@Configuration //1.主要用于标记配置类,兼备Component的效果。
@EnableScheduling // 2.开启定时任务
public class ScheduleTaskConfig {
//3.添加定时任务
@Scheduled(cron = "0/5 * * * * ?")
//或直接指定时间间隔,例如:5秒
//@Scheduled(fixedRate=5000)
private void configureTasks() {
System.err.println("执行静态定时任务时间: " + LocalDateTime.now());
}
}
Cron表达式参数分别表示:
- 秒(0~59) 例如0/5表示每5秒
- 分(0~59)
- 时(0~23)
- 日(0~31)的某天,需计算
- 月(0~11)
- 周几( 可填1-7 或 SUN/MON/TUE/WED/THU/FRI/SAT)
@Scheduled:除了支持灵活的参数表达式cron之外,还支持简单的延时操作,例如 fixedDelay ,fixedRate 填写相应的毫秒数即可。
建议:直接点击在线Cron表达式生成器生成参数比较方便
Spring Boot 日志框架
常见的日志框架有 log4j
、 logback
、 log4j2
。
log4j 这个日志框架显示是耳熟能详了,在Spring开发中是经常使用,但是据说log4j官方已经不再更新了,而且在性能上比 logback 、 log4j2 差了很多。
logback
是由 log4j 创始人
设计的另外一个开源日志框架,logback相比之于log4j性能提升了10以上
, 初始化内存加载也更小了
。作为的Spring Boot默认的日志框架
肯定是有着不小的优势。 log4j2 晚于 logback 推出,官网介绍性能比 logback 高,但谁知道是不是王婆卖瓜自卖自夸,坊间流 传,log4j2在很多思想理念上都是照抄logback,因此即便log4j2是Apache官方项目,Spring等许多框 架项目没有将它纳入主流。此处完全是作者道听途说,不必当真,题外话而已。
代码中如何使用日志?
第一种其实也是很早之前常用的一种方式,只需要在代码添加如下:
private final Logger logger= LoggerFactory.getLogger(DemoApplicationTests.class);
这种方式显然比较鸡肋,如果每个类中都添加一下岂不是很low。别着急,lombok为我们解决了这个难题。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
使用也是很简单,只需要在类上标注一个注解 @Slf4j 即可,如下:
@Slf4j
class DemoApplicationTests {
@Test
public void test(){
log.debug("输出DEBUG日志.......");
}
}
如何定制日志级别?
Spring Boot中默认的日志级别是INFO,但是可以自己定制日志级别,如下:
logging:
level:
root: debug
上面是将所有的日志的级别都改成了 DEBUG
日志如何输出到文件中?
Spring Boot中日志默认是输出到控制台的,但是在生产环境中显示不可行的
,因此需要配置日志输出 到日志文件中。 其中有两个重要配置如下:
logging.file.path
:指定日志文件的路径logging.file.name
:日志的文件名,默认为 spring.log- 注意:官方文档说这两个属性不能同时配置,否则不生效,因此只需要配置一个即可。 指定输出的文件为当前项目路径的 logs 文件下,默认生成的日志文件为 spring.log ,如下:
logging:
file:
path: ./log
如何定制日志格式?
有时我们需要定制自己需要的日志输出格式,这样在排查日志 的时候能够一目了然。
定制日志格式有两个配置,分别是控制台的输出格式和文件中的日志输出格式,如下:
logging.pattern.console
:控制台的输出格式logging.pattern.file
:日志文件的输出格式
logging:
file:
path: ./log
pattern:
console: "%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n"
file: "%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n"
level:
root: info
%d{HH:mm:ss.SSS}——日志输出时间
%thread——输出日志的进程名字,这在Web应用以及异步任务处理中很有用
%-5level——日志级别,并且使用5个字符靠左对齐
%logger- ——日志输出者的名字
%msg——日志消息
%n——平台的换行符