ApplicationRunner CommandLineRunner @PostConstruct static

news/2024/3/29 13:59:53/文章来源:https://blog.csdn.net/qq_37700773/article/details/129208188

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

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

  • 前言
  • 一、四种实现方式
    • 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;}@Overridepublic 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;}@Overridepublic 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;}@PostConstructpublic 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捕获异常

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

总结

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

2023年加油加油!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_73866.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

复杂场景的接口测试

测试场景一:被测业务操作是由多个API调用协作完成 背景:一个单一的前端操作可能会触发后端一系列的API调用,此时API的测试用例就不再是简单的单个API调用,而是一系列API的调用 存在的情况:存在后一个API需要使用前一个…

springboot+vue软件bug项目测试过程管理系统

config:主要用来存储配置文件,以及其他不怎么动用的信息 controller:项目的主要控制文件 dao: 主要用来操作数据库 entity: 实体,用来放与数据库表里对应的实体类,表中的字段对应类中的属性值,并…

视觉SLAM数据集(一):TUM DataSet

首先给出数据集下载地址:TUM Dataset Download。 如果你是第一次做实验,建议下载xyz的数据集,因为它的动作相对很小,只包含桌面上的一小部分。一旦成功测试,就可以试试desk数据集,它包含四张桌子和几个闭环…

C语言的学习小结——数组

一、一维数组的创建与初始化 1、格式: type_t arr_name[const_n];//type_t 是指数组的元素类型 //const_n 是一个常量表达式,用来指定数组的大小 注: 数组是使用下标来访问的,下标从0开始。 数组的大小可以通过计算得到&…

电商平台商品详情接口的应用场景

API接口的定义价格、库存量、发货地点等。此外,它还可以提供商品的详细信息,包括商品的图片、详细描述、规格参数、售后服务等。这些信息可以帮助用户更好地了解商品,从而更好地选择商品。其次,电商平台商品详情接口的实现原理是基…

使用Chemistry Development Kit (CDK) 来进行化学SMILES子结构匹配

摘要 SMILES是一种用于描述化合物结构的字符串表示法,其中子结构搜索是在大规模化合物数据库中查找特定的结构。然而,这种搜索方法存在一个误解,即将化合物的子结构视为一个独立的实体进行搜索,而忽略了它们在更大的化合物中的上…

极光笔记 | 埋点体系建设与实施方法论

PART 01 前 言随着网络技术的发展,从粗犷型到精细化运营型,再到现在的数字化运营,数据变得越来越细分和重要,不仅可以进行策略调整,还可以实现自动化的精细化运营。而数据价值的起点就是埋点,只有合理地埋点…

lammps教程:Ovito选择特定晶粒的方法

大家好,我是小马老师。 本文介绍如何使用ovito提取特定的晶粒。 在多晶的lammps模拟中,可能会对某一个特定晶粒的变形情况进行分析,此时,需要找到这个晶粒,并进行单独分析。 ovito有专用的晶粒识别命令,…

【系统分析师之路】2022上案例分析历年真题

【系统分析师之路】2022上案例分析历年真题 【系统分析师之路】2022上案例分析历年真题【系统分析师之路】2022上案例分析历年真题2022上案例分析历年真题第一题(25分)2022上案例分析历年真题第二题(25分)2022上案例分析历年真题第…

RocketMQ 5.x新版本部署优化一览

​ RocketMQ从2022年9月份开始推出了新的5.x大版本。相比于之前的4.x版本,5.x版本向云原生前进了一大步。在增强原因功能的基础上,更是支持多语言客户端,周边生态也进行了补强和完善,明显可以看到离Kafka老大哥又近了很大一步。 …

由Geoscene Enterprise 2.1 升级至Geoscene Enterprise 3.1

文章目录一、升级前工作二、升级Geoscene portal三、升级Web Adaptor(针对portal门户)四、升级Server 站点(作为门户托管服务器)五、升级Web Adaptor(针对server)六、升级Data Store需求:由GeoS…

springboot自定义starter时使用@AutoConfigureBefore、@AutoConfigureAfter的细节问题

正常利用springboot的自动装配 ConfB Configuration(proxyBeanMethodsfalse) public class ConfB {public ConfB(){System.out.println("ConfB构造方式执行...");} }不加spring.factories 项目包结构 此时resources中没有spring.factories 执行结果 2023-02-24…

教你用反射机制如何几分钟搭建完后端

如果想快速搭建后台跨域使用这些技术 反射mybatis-plusjson 反射可以实现动态数据的传输 一般对数据库进行操作肯定离不开这些代码 如果我们用反射机制只需要这一个就行 而说到反射的好处,一般情况下我们做增删改查需要大量的接口才能完成,而用反射我…

通过操作Cortex-A7核,串口输入相应的命令,控制LED灯进行工作

1.通过操作Cortex-A7核,串口输入相应的命令,控制LED灯进行工作 例如在串口输入led1on,开饭led1灯点亮 2.例如在串口输入led1off,开饭led1灯熄灭 3.例如在串口输入led2on,开饭led2灯点亮 4.例如在串口输入led2off,开饭led2灯熄灭 5.例如在串口输入led…

LabVIEW主VI前面板中显示或使用多个子VI

LabVIEW主VI前面板中显示或使用多个子VI想在程序中连接一个或多个子VI的前面板,但是当调用它们时,每个子VI在计算机屏幕上显示为一个新窗口。那么怎么能让每个子VI作为主VI前面板的一部分进行显示,而不是在屏幕上显示多个窗口?正在…

Malware Dev 00 - Rust vs C++ 初探

写在最前 如果你是信息安全爱好者,如果你想考一些证书来提升自己的能力,那么欢迎大家来我的 Discord 频道 Northern Bay。邀请链接在这里: https://discord.gg/9XvvuFq9Wb我会提供备考过程中尽可能多的帮助,并分享学习和实践过程…

mysql 内存架构

1. 背景 从 innodb 的整体架构中可以知道 innodb 的内存架构中分为 buffer pool 缓存区, change pool 修改缓冲区, adaptive hash index 自适应哈希索引, 和 log buffer 日志缓冲区. 2. buffer pool buffer pool 是用于缓冲磁盘页的数据,mysql 的80%的内存会分配给…

GroupDocs.Merger for Java

GroupDocs.Merger for Java GroupDocs.Merger for Java是一个文档操作API,可帮助您合并、拆分、交换或删除文档页面。API通过启用或禁用密码提供保护,并允许开发人员加入PDF、Microsoft Word、Excel和Powerpoint文档。 支持的文件格式 Microsoft Office格…

内存管理框架---Slab(二)

站在Arnold Lu南京大佬的肩膀,俯瞰内存管理之slab 文章目录slab层的由来slab/slub/slobslab层的设计思想slab相关数据结构创建slab描述符分配slab对象释放slab对象销毁缓存在内核栈上的静态分配高端内存的映射永久映射临时映射每个CPU的分配新的每个CPU接口编译时的…

为什么需要这个岗位,软件测试是干什么

目录 一、软件测试概念 二、软件测试目的 三、软件测试基本原则 四、软件测试主要工作内容 五、软件测试方法 六、测试工程师的职责 七、为什么要软件测试这个岗位 一、软件测试概念 软件测试:为了发现软件错误和缺陷(统称bug)而执行…