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. 【SpringMVC】(一)

    SpringMVC简介 SpringMVC是Spring的一个后续产品,是Spring的一个子项目 基于原生的Servlet,通过了功能强大的DispatcherServlet,对请求和响应进行统一处 ...

  2. ABPvNext-微服务框架基础入门

    ABPvNext-微服务框架基础入门 本文使用的是ABPvNext商业版 最新稳定版本7.0.2为演示基础的,后续如果更新,会单独写一篇最新版本的,此文为零基础入门教程,后续相关代码会同步更新到git ...

  3. Vue闪烁的问题

    问题: 当我们打开Vue页面的时候,如果弱网环境,会出现一个闪烁的效果 原因: Vue还来不及处理的模板 解决: 使用 v-cloak 来解决Vue这个打开页面的闪烁的问题 原理: 利用 v-cloa ...

  4. 我的第一个NPM包:panghu-planebattle-esm(胖虎飞机大战)使用说明

    好家伙,我的包终于开发完啦 欢迎使用胖虎的飞机大战包!! 为你的主页添加色彩 这是一个有趣的网页小游戏包,使用canvas和js开发 使用ES6模块化开发 效果图如下:  (觉得图片太sb的可以自己改 ...

  5. 使用Vue.js实现文字跑马灯效果

    实现文字跑马灯效果,首先用到 substring()截取 和 setInterval计时器 clearInterval()清除计时器 效果如下: 实现代码如下: <!DOCTYPE html&g ...

  6. SqlServer 添加字段说明、表说明

    1.添加表说明 EXECUTE sp_addextendedproperty N'MS_Description','表说明',N'user',N'dbo',N'table',N'表名',NULL,NU ...

  7. P1008 [NOIP1998 普及组] 三连击,置顶题解的问题

    题目链接: https://www.luogu.com.cn/problem/P1008 置顶题解 暴力,加简化的判断,数学原理,2个集合内所有数相加相乘结果一样,2个集合的内容一样(没错我自己编得, ...

  8. 文心一言 VS chatgpt (15)-- 算法导论3.2 4~5题

    四.函数 $\lceil \lg n \rceil !$ 多项式有界吗?函数 $\lceil \lg \lg n \rceil !$ 多项式有界吗? 文心一言: chatgpt: 对于第一个问题,函数 ...

  9. 2020-01-16:我截获了登录token的话,是不是就获得了登录状态,这样就不安全了。如何保证安全?

    福哥答案2020-01-06:[知乎答案:](https://www.zhihu.com/question/439602796)首先,Token 一般放在 Header 或者 Cookies 中,Ht ...

  10. 2022-02-06:等差数列划分 II - 子序列。 给你一个整数数组 nums ,返回 nums 中所有 等差子序列 的数目。 如果一个序列中 至少有三个元素 ,并且任意两个相邻元素之差相同,则称

    2022-02-06:等差数列划分 II - 子序列. 给你一个整数数组 nums ,返回 nums 中所有 等差子序列 的数目. 如果一个序列中 至少有三个元素 ,并且任意两个相邻元素之差相同,则称 ...