Springboot项目启动后执行特定方法

Springboot给我们提供了两种“开机启动”方式:ApplicationRunner和CommandLineRunner。

这两种方法提供的目的是为了满足,在项目启动的时候立刻执行某些方法。我们可以通过实现ApplicationRunner和CommandLineRunner,来实现,他们都是在SpringApplication 执行之后开始执行的。

CommandLineRunner接口可以用来接收字符串数组的命令行参数,ApplicationRunner 是使用ApplicationArguments 用来接收参数的

使用ApplicationRunner

/**
* 项目启动执行 ApplicationRunner
*/
@Component
public class MyApplicationRunner implements ApplicationRunner { private static Logger log = LoggerFactory.getLogger(MyCommandLineRunner.class); @Override
public void run(ApplicationArguments var1) throws Exception{
log.info(" ApplicationRunner 项目启动,开始执行..."); }
}

使用 CommandLineRunner

/**
* 项目启动执行 CommandLineRunner
*/
@Component
public class MyCommandLineRunner implements CommandLineRunner { private static Logger log = LoggerFactory.getLogger(MyCommandLineRunner.class);
@Override
public void run(String... var1) throws Exception {
log.info(" CommandLineRunner 项目启动,开始执行...");
}
}

项目启动测试

2022-08-17 20:25:07.723  INFO 13704 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8089 (https) with context path '/gc'
2022-08-17 20:25:07.763 INFO 13704 --- [ restartedMain] com.chat.gc.GcChatWebrtcApplication : Started GcChatWebrtcApplication in 3.862 seconds (JVM running for 152.095)
2022-08-17 20:25:07.765 INFO 13704 --- [ restartedMain] com.chat.gc.config.MyCommandLineRunner : ApplicationRunner 项目启动,开始执行...
2022-08-17 20:25:07.765 INFO 13704 --- [ restartedMain] com.chat.gc.config.MyCommandLineRunner : CommandLineRunner 项目启动,开始执行...
2022-08-17 20:25:07.901 INFO 13704 --- [ restartedMain] .ConditionEvaluationDeltaLoggingListener : Condition evaluation unchanged

指定启动方法执行的顺序

如果想要指定启动方法执行的顺序,可以通过实现org.springframework.core.Ordered接口或者使用org.springframework.core.annotation.Order注解来实现。

以ApplicationRunner 为例来分别实现

Ordered接口:

    /**
* 项目启动执行 ApplicationRunner
*/
@Component
public class MyApplicationRunner implements ApplicationRunner, Ordered { private static Logger log = LoggerFactory.getLogger(MyCommandLineRunner.class); @Override
public void run(ApplicationArguments var1) throws Exception{
log.info(" ApplicationRunner 项目启动,开始执行...");
} @Override
public int getOrder() {
return 1;
}
}

项目启动测试

2022-08-17 20:30:24.063  INFO 7460 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8089 (https) with context path '/gc'
2022-08-17 20:30:24.069 INFO 7460 --- [ restartedMain] com.chat.gc.GcChatWebrtcApplication : Started GcChatWebrtcApplication in 15.202 seconds (JVM running for 20.388)
2022-08-17 20:30:24.071 INFO 7460 --- [ restartedMain] com.chat.gc.config.MyCommandLineRunner : ApplicationRunner 项目启动,开始执行...
2022-08-17 20:30:24.071 INFO 7460 --- [ restartedMain] com.chat.gc.config.MyCommandLineRunner : CommandLineRunner 项目启动,开始执行...

Order注解实现方式:

/**
* 项目启动执行 CommandLineRunner
*/
@Order(value = 2)
@Component
public class MyCommandLineRunner implements CommandLineRunner { private static Logger log = LoggerFactory.getLogger(MyCommandLineRunner.class);
@Override
public void run(String... var1) throws Exception {
log.info(" CommandLineRunner 项目启动,开始执行...");
} }

项目启动测试

2022-08-17 20:41:36.148  INFO 696 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8089 (https) with context path '/gc'
2022-08-17 20:41:36.156 INFO 696 --- [ restartedMain] com.chat.gc.GcChatWebrtcApplication : Started GcChatWebrtcApplication in 18.13 seconds (JVM running for 22.356)
2022-08-17 20:41:36.159 INFO 696 --- [ restartedMain] com.chat.gc.config.MyCommandLineRunner : ApplicationRunner 项目启动,开始执行...
2022-08-17 20:41:36.160 INFO 696 --- [ restartedMain] com.chat.gc.config.MyCommandLineRunner : CommandLineRunner 项目启动,开始执行...

补充系统退出/关闭时监听

@Component
public class MyApplicationRunner implements ApplicationRunner, DisposableBean {
private static Logger log = LoggerFactory.getLogger(MyApplicationRunner.class); @Override
public void run(ApplicationArguments args) throws Exception {
log.info(" ApplicationRunner 项目启动,开始执行...");
} @Override
public void destroy() throws Exception {
log.info(" ApplicationRunner 系统停止运行,开始关闭...");
}
}

日志:

2023-02-02 15:53:35.457  INFO 304 --- [           main] usi.paofu.PaofuApplication               : Started PaofuApplication in 18.515 seconds (JVM running for 25.814)
2023-02-02 15:53:35.460 INFO 304 --- [ main] usi.paofu.run.MyApplicationRunner : ApplicationRunner 项目启动,开始执行...
Disconnected from the target VM, address: '127.0.0.1:50138', transport: 'socket'
2023-02-02 15:54:38.641 INFO 304 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
2023-02-02 15:54:38.645 INFO 304 --- [extShutdownHook] usi.paofu.run.MyApplicationRunner : ApplicationRunner 系统停止运行,开始关闭...
2023-02-02 15:54:38.706 INFO 304 --- [extShutdownHook] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} closed

参考:https://www.cnblogs.com/cnsyear/p/12732168.html

【Springboot】项目启动后执行特定方法的更多相关文章

  1. Springboot 项目启动后执行某些自定义代码

    Springboot 项目启动后执行某些自定义代码 Springboot给我们提供了两种"开机启动"某些方法的方式:ApplicationRunner和CommandLineRun ...

  2. Spring Boot学习--项目启动时执行特定方法

    Springboot给我们提供了两种"开机启动"某些方法的方式:ApplicationRunner和CommandLineRunner. 这两种方法提供的目的是为了满足,在项目启动 ...

  3. SpringBoot项目启动后再请求远程接口的实现方式

    场景 有一个SpringBoot项目需要在启动后请求另一个远程服务拿取配置,而不是加载过程中去请求,可能会出现类没有实例化的场景,因此需要实现项目完全启动后再进行请求的场景. 解决 一般会有两种实现方 ...

  4. springboot2.X 在项目启动后执行一段自定义代码

    场景: 项目需要在项目启动后从数据库初始化一些数据进入redis , 但是没有很适合 的监听器去实现 , 监听 老是在dao初始化之前触发. 解决方法:自定义类实现 ApplicationRunner ...

  5. 在web项目启动时执行某个方法

    在web项目中有很多时候需要在项目启动时就执行一些方法,而且只需要执行一次,比如:加载解析自定义的配置文件.初始化数据库信息等等,在项目启动时就直接执行一些方法,可以减少很多繁琐的操作. 在工作中遇到 ...

  6. Springboot项目启动后自动创建多表关联的数据库与表的方案

    文/朱季谦 在一些项目开发当中,存在这样一种需求,即开发完成的项目,在第一次部署启动时,需能自行构建系统需要的数据库及其对应的数据库表. 若要解决这类需求,其实现在已有不少开源框架都能实现自动生成数据 ...

  7. Springboot项目启动后访问不到Controller

    1.搭建一个简单的Springboot项目,最开始将启动类main函数与controller放到一个类里,可以正常启动和访问,但是将两个分开再启动时访问就会报错:This application ha ...

  8. Java项目启动时执行指定方法的几种方式

    很多时候我们都会碰到需要在程序启动时去执行的方法,比如说去读取某个配置,预加载缓存,定时任务的初始化等.这里给出几种解决方案供大家参考. 1. 使用@PostConstruct注解 这个注解呢,可以在 ...

  9. spring注解之@PostConstruct在项目启动时执行指定方法

    一.注解解释 Spring的@PostConstruct注解在方法上,表示此方法是在Spring实例化该Bean之后马上执行此方法,之后才会去实例化其他Bean,并且一个Bean中@PostConst ...

  10. SpringBoot#应用启动后执行某些逻辑

    // 方式1 @Component public class WhenStartupA implements InitializingBean { @Override public void afte ...

随机推荐

  1. CSS实现单行或者多行文本溢出隐藏并且显示省略号

    一.单行超出显示省略号如果文字超出父元素指定宽度,文字会自动换行,而连续不间断数字和英文字母(没有其他字符)不会自动换行: 详细步骤: 第一步(不换行):white-space:nowrop;(对于连 ...

  2. 基于 Github 平台的 .NET 开源项目模板. 嘎嘎实用!

    简介 大家好,为了使开源项目的维护和管理更方便一些,出于个人需求写了一款开源项目的模板,该模板基于 Github 平台,并使用 .NET 来实现管道功能. 在接受过实战检验后, 于今天开源, 项目地址 ...

  3. 沁恒 CH32V208(一): CH32V208WBU6 评估板上手报告和Win10环境配置

    目录 沁恒 CH32V208(一): CH32V208WBU6 评估板上手报告和Win10环境配置 CH32V208 CH32V208系列是沁恒32位RISC-V中比较新的一个系列, 基于青稞RISC ...

  4. 用tk.mybaits实现指定字段更新

    ​ 去年年底的因为业务需要需要在使用tk.mybaits框架的系统中实现指定字段的更新,可是tk.mybaits框架本身并不支持这个功能,我翻遍了CSDN和其他相关的技术相关的网站都没有找到相关的解决 ...

  5. ssh终端工具推荐-WindTerm

    什么是WindTerm 官方github https://github.com/kingToolbox/WindTerm A Quicker and better SSH/Telnet/Serial/ ...

  6. 2022-12-16:给你一个长度为n的数组,并询问q次 每次询问区间[l,r]之间是否存在小于等于k个数的和大于等于x 每条查询返回true或者false。 1 <= n, q <= 10^5 k

    2022-12-16:给你一个长度为n的数组,并询问q次 每次询问区间[l,r]之间是否存在小于等于k个数的和大于等于x 每条查询返回true或者false. 1 <= n, q <= 1 ...

  7. 2020-09-15:java里的wait()和sleep()的区别有哪些?

    福哥答案2020-09-15:#福大大架构师每日一题# 1.线程状态.wait()的线程状态是TimedWaiting和Waiting.sleep()的线程状态是Waiting.2.指定时间.wait ...

  8. golang技术栈常见网址

    go所有,包含goadmin golang标准库文档 golang修养之路 Golang Profiling: 关于 pprof go问题 go语言设计与实现 go.mod解析 proto3 prot ...

  9. Visual Studio2019打开电脑摄像头

    #include<iostream> //opencv头文件 #include<opencv2/opencv.hpp> using namespace std; using n ...

  10. vue 中render执行流程梳理

    用了多年vue 今天对自己了解的render 做一个梳理 一.使用template模板 先从vue 初始化开始: 众所周知项目的main.js中定义了 var app = new Vue({})这vu ...