我是靠谱客的博主 正直学姐,最近开发中收集的这篇文章主要介绍ApplicationRunner & CommandLineRunner & @PostConstruct & static前言一、四种实现方式二、执行结果三、注意异常总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

系统启动后加载初始化数据

  • 前言
  • 一、四种实现方式
    • ApplicationRunner
    • CommandLineRunner
    • @PostConstruct
    • static
  • 二、执行结果
  • 三、注意异常
  • 总结


前言

不是很建议使用这些类
建议:
1:页面按钮(后端读表放入缓存,还可以实现reload/unload等)初始化数据
2:懒加载机制,后端用到时,再去读表+放入缓存
3:如果是某些配置,如:请求url,配置参数,那么一定要写到配置文件里,不要这样启动后再去加载

一、四种实现方式

被调用服务 InitService

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class InitService {
public void init() {
log.info("InitService");
}
}

ApplicationRunner

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.util.concurrent.Executors;
@Slf4j
@Component
public class ApplicationRunnerExtend implements ApplicationRunner {
private final InitService initService;
public ApplicationRunnerExtend(InitService initService) {
this.initService = initService;
}
@Override
public void run(ApplicationArguments args) throws Exception {
log.info("-----------ApplicationRunnerExtend-----------");
Executors.newSingleThreadExecutor().execute(() -> {
log.info("开启线程执行");
initService.init();
});
}
}

CommandLineRunner

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class CommandLineRunnerExtend implements CommandLineRunner {
private final InitService initService;
public CommandLineRunnerExtend(InitService initService) {
this.initService = initService;
}
@Override
public void run(String... args) throws Exception {
log.info("-----------CommandLineRunnerExtend-----------");
initService.init();
}
}

@PostConstruct

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Slf4j
@Component
public class PostConstructExtend {
private final InitService initService;
public PostConstructExtend(InitService initService) {
this.initService = initService;
}
@PostConstruct
public void init() {
log.info("-----------PostConstructExtend-----------");
initService.init();
}
}

static

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class StaticExtend {
static {
InitService initService = new InitService();
log.info("-----------StaticExtend-----------");
initService.init();
}
}

二、执行结果

[
main] o.a.c.c.C.[Tomcat].[localhost].[/]
: Initializing Spring embedded WebApplicationContext
[
main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 891 ms
[
main] c.e.demo.runner.PostConstructExtend
: -----------PostConstructExtend-----------
[
main] com.example.demo.runner.InitService
: InitService
[
main] com.example.demo.runner.StaticExtend
: -----------StaticExtend-----------
[
main] com.example.demo.runner.InitService
: InitService
[
main] o.s.b.w.embedded.tomcat.TomcatWebServer
: Tomcat started on port(s): 8080 (http) with context path ''
[
main] com.example.demo.TaoDemoApplication
: Started TaoDemoApplication in 21.677 seconds (JVM running for 27.449)
[
main] c.e.demo.runner.ApplicationRunnerExtend
: -----------ApplicationRunnerExtend-----------
[
main] c.e.demo.runner.CommandLineRunnerExtend
: -----------CommandLineRunnerExtend-----------
[
main] com.example.demo.runner.InitService
: InitService
[pool-2-thread-1] c.e.demo.runner.ApplicationRunnerExtend
: 开启线程执行
[pool-2-thread-1] com.example.demo.runner.InitService
: InitService

三、注意异常

InitService中新增方法(会抛异常)


public void initTwo(){
log.info("InitService");
String str = null;
str.contains("123");
}

ApplicationRunner 和 CommandLineRunner虽然是在spring启动成功后再执行的,但如果是执行initTwo,则会因为异常导致启动失败。

建议:
1:异步执行initTwo(),不造成spring启动失败


public void run(ApplicationArguments args) throws Exception {
log.info("-----------ApplicationRunnerExtend-----------");
Executors.newSingleThreadExecutor().execute(() -> {
log.info("开启线程执行");
initService.initTwo();
});
}

2:使用try/catch捕获异常


@Override
public void run(String... args) throws Exception {
log.info("-----------CommandLineRunnerExtend-----------");
try {
initService.initTwo();
}catch (Exception e){
log.error("异常了!!!");
}
}

总结

@PostConstructstatic 不建议用来初始化数据。
他们是在spring启动完成之前执行的,除非必要,不要用这两个去加载初始化数据。

2023年加油加油!

最后

以上就是正直学姐为你收集整理的ApplicationRunner & CommandLineRunner & @PostConstruct & static前言一、四种实现方式二、执行结果三、注意异常总结的全部内容,希望文章能够帮你解决ApplicationRunner & CommandLineRunner & @PostConstruct & static前言一、四种实现方式二、执行结果三、注意异常总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部