iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >springboot应用服务启动事件的监听怎么实现
  • 753
分享到

springboot应用服务启动事件的监听怎么实现

2023-06-29 20:06:13 753人浏览 八月长安
摘要

本篇内容主要讲解“SpringBoot应用服务启动事件的监听怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springboot应用服务启动事件的监听怎么实现”吧!一、简介Spring B

本篇内容主要讲解“SpringBoot应用服务启动事件的监听怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习springboot应用服务启动事件的监听怎么实现”吧!

    一、简介

    Spring Boot提供了两个接口:CommandLineRunner、ApplicationRunner,用于启动应用时做特殊处理,这些代码会在SpringApplication的run()方法运行完成之前被执行。相对于之前章节为大家介绍的Spring的ApplicationListener接口自定义监听器、Servlet的ServletContextListener监听器。使用二者的好处在于,可以方便的使用应用启动参数,根据参数不同做不同的初始化操作。

    二、常用场景介绍

    实现CommandLineRunner、ApplicationRunner接口。通常用于应用启动前的特殊代码执行,比如:

    • 将系统常用的数据加载到内存

    • 应用上一次运行的垃圾数据清理

    • 系统启动成功后的通知的发送等

    如下图是我实现了CommandLineRunner接口,在应用启动时将系统内常用的配置数据。从数据库加载到内存,以后使用该数据的时候只需要调用getSysConfigList方法,不需要每次使用该数据都去数据库加载。节省系统资源、缩减数据加载时间。

    springboot应用服务启动事件的监听怎么实现

    二、代码小实验 通过@Component定义方式实现

    CommandLineRunner:参数是字符串数组

    @Slf4j@Componentpublic class CommandLineStartupRunner implements CommandLineRunner {    @Override    public void run(String... args){        log.info("CommandLineRunner传入参数:{}", Arrays.toString(args));    }}

    ApplicationRunner:参数被放入ApplicationArguments,通过getOptionNames()、getOptionValues()、getSourceArgs()获取参数

    @Slf4j@Componentpublic class AppStartupRunner implements ApplicationRunner {    @Override    public void run(ApplicationArguments args)  {        log.info("ApplicationRunner参数名称: {}", args.getOptionNames());        log.info("ApplicationRunner参数值: {}", args.getOptionValues("age"));        log.info("ApplicationRunner参数: {}", Arrays.toString(args.getSourceArgs()));    }}

    通过@Bean定义方式实现

    这种方式可以指定执行顺序,注意前两个Bean是CommandLineRunner,最后一个Bean是ApplicationRunner 。

    @Configurationpublic class BeanRunner {    @Bean    @Order(1)    public CommandLineRunner runner1(){        return new CommandLineRunner() {            @Override            public void run(String... args){                System.out.println("BeanCommandLineRunner run1()" + Arrays.toString(args));            }        };    }    @Bean    @Order(2)    public CommandLineRunner runner2(){        return new CommandLineRunner() {            @Override            public void run(String... args){                System.out.println("BeanCommandLineRunner run2()" + Arrays.toString(args));            }        };    }    @Bean    @Order(3)    public ApplicationRunner runner3(){        return new ApplicationRunner() {            @Override            public void run(ApplicationArguments args){                System.out.println("BeanApplicationRunner run3()" + Arrays.toString(args.getSourceArgs()));            }        };    }}

    可以通过@Order设置执行顺序

    三、执行测试

    idea Springboot启动配置中加入如下参数,保存后启动应用

    springboot应用服务启动事件的监听怎么实现

    测试输出结果:

    c.z.boot.launch.config.AppStartupRunner  : ApplicationRunner参数名称: [name, age]
    c.z.boot.launch.config.AppStartupRunner  : ApplicationRunner参数值: [18]
    c.z.boot.launch.config.AppStartupRunner  : ApplicationRunner参数: [--name=zimug, --age=18]

    BeanApplicationRunner run3()[--name=zimug, --age=18]

    c.z.b.l.config.CommandLineStartupRunner  : CommandLineRunner传入参数:[--name=zimug, --age=18]
    BeanCommandLineRunner run1()[--name=zimug, --age=18]
    e=18]
    BeanCommandLineRunner run2()[--name=zimug, --age=18]

    从测试结果上看(笔者目前不敢确定这个优先级顺序是不是常态,但从我的多次测试效果,顺序一直是这样的):

    • ApplicationRunner执行优先级高于CommandLineRunner

    • 以Bean的形式运行的Runner优先级要低于Component注解加implements Runner接口的方式

    • Order注解只能保证同类的CommandLineRunner或ApplicationRunner的执行顺序,不能跨类保证顺序

    四、总结

    CommandLineRunner、ApplicationRunner的核心用法是一致的,就是用于应用启动前的特殊代码执行。ApplicationRunner的执行顺序先于CommandLineRunner;ApplicationRunner将参数封装成了对象,提供了获取参数名、参数值等方法,操作上会方便一些。

    五、问题总结

    这是笔者在实践中真实遇到的问题,就是我定义了多个CommandLineRunner的实现。出现奇怪的问题是:当你定义多个CommandLineRunner的实现的时候,其中一个或者几个将不会执行。

    分析一下:下面的代码是SpringBootApplication启动项目之后会执行的代码,大家看代码中通过一个遍历来启动CommandLineRunner或者ApplicationRunner。也就是说,只有上一个CommandLineRunner执行完成之后,才会执行下一个CommandLineRunner,是同步执行的。

    private void callRunners(ApplicationContext context, ApplicationArguments args) {List<Object> runners = new ArrayList<>();runners.addAll(context.getBeansOfType(ApplicationRunner.class).values());runners.addAll(context.getBeansOfType(CommandLineRunner.class).values());AnnotationAwareOrderComparator.sort(runners);for (Object runner : new LinkedHashSet<>(runners)) {if (runner instanceof ApplicationRunner) {callRunner((ApplicationRunner) runner, args);}if (runner instanceof CommandLineRunner) {callRunner((CommandLineRunner) runner, args);}}}

    所以,如果在CommandLineRunner某个实现run 方法体中调用了同步阻塞的api或者是一个 while(true) 循环,在遍历中处于该CommandLineRunner之后的其他实现将不会被执行。

    到此,相信大家对“springboot应用服务启动事件的监听怎么实现”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    --结束END--

    本文标题: springboot应用服务启动事件的监听怎么实现

    本文链接: https://www.lsjlt.com/news/326367.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • springboot应用服务启动事件的监听怎么实现
      本篇内容主要讲解“springboot应用服务启动事件的监听怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springboot应用服务启动事件的监听怎么实现”吧!一、简介Spring B...
      99+
      2023-06-29
    • springboot应用服务启动事件的监听实现
      目录一、简介二、常用场景介绍二、代码小实验 通过@Component定义方式实现通过@Bean定义方式实现三、执行测试四、总结五、问题总结一、简介 Spring Boot提供了两个接...
      99+
      2022-11-13
    • 怎么在Android应用中利用ListView实现一个监听滑动事件
      怎么在Android应用中利用ListView实现一个监听滑动事件?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。ListView的主要有两种滑动事件监听方法,OnTouchLi...
      99+
      2023-05-31
      listview android roi
    • Vue怎么通过监听滚动事件实现动态锚点
      本文小编为大家详细介绍“Vue怎么通过监听滚动事件实现动态锚点”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue怎么通过监听滚动事件实现动态锚点”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。具体效果如下:一、...
      99+
      2023-07-04
    • Android中的监听触摸事件怎么在Fragment中实现
      本篇文章为大家展示了Android中的监听触摸事件怎么在Fragment中实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。activity的触摸事件 @Override public boolea...
      99+
      2023-05-31
      android fragment roi
    • Oracle数据库产重启服务和监听程序怎么实现
      这篇文章主要介绍“Oracle数据库产重启服务和监听程序怎么实现”,在日常操作中,相信很多人在Oracle数据库产重启服务和监听程序怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Oracle数据库产重...
      99+
      2023-06-22
    • golang 监听服务的信号,实现平滑启动,linux信号说明详解
      监听服务的信号,实现平滑启动,linux信号说明 package main import ( "context" "fmt" "golang.org/x/sync/er...
      99+
      2022-11-12
    • android io.socket如何拦截所有监听事件实现和服务器端anything一样的事件
      重写OkHttpClient class MyOkHttpClient extends OkHttpClient { @Override public WebSocket newWebSocket(...
      99+
      2022-06-06
      io 和服 服务器 监听 事件 socket Android
    • shell脚本怎么实现监控php-fpm并自动重启服务
      这篇文章主要讲解了“shell脚本怎么实现监控php-fpm并自动重启服务”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“shell脚本怎么实现监控php-fpm并自动重启服务”吧!脚本代码:...
      99+
      2023-06-09
    • 怎么在springBoot中利用service实现层事务控制的操作
      怎么在springBoot中利用service实现层事务控制的操作?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。springBoot使用事物比较简单,在Appl...
      99+
      2023-06-06
    • 怎么用springboot+jersey+tomcat实现跨域方式上传文件到服务器
      本文小编为大家详细介绍“怎么用springboot+jersey+tomcat实现跨域方式上传文件到服务器”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用springboot+jersey+tomcat实现跨域方式上传文件到服务器”文...
      99+
      2023-07-05
    • c# textbox失去焦点所引发的服务端事件怎么实现
      这篇文章主要介绍“c# textbox失去焦点所引发的服务端事件怎么实现”,在日常操作中,相信很多人在c# textbox失去焦点所引发的服务端事件怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”c# ...
      99+
      2023-06-17
    • 怎么使用SAP SAT事务码对通过浏览器启动的应用的性能测量和分析方式
      怎么使用SAP SAT事务码对通过浏览器启动的应用的性能测量和分析方式,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。三个产品都有登录语言的选择:CRMC4C:Hybris:...
      99+
      2023-06-04
    • 怎么实现Kubernetes跨集群服务应用的高可用
      本篇文章给大家分享的是有关怎么实现Kubernetes跨集群服务应用的高可用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在Kubernetes 1.3版本,我们希望降低跨集群...
      99+
      2023-06-05
    • 怎么用BAT脚本实现自动上传文件到ftp服务器的功能
      这篇文章主要讲解了“怎么用BAT脚本实现自动上传文件到ftp服务器的功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用BAT脚本实现自动上传文件到ftp服务器的功能”吧!代码如下:@E...
      99+
      2023-06-08
    • 怎么用服务器的负载均衡nginx+tomcat实现动静分离
      这篇文章主要介绍“怎么用服务器的负载均衡nginx+tomcat实现动静分离”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用服务器的负载均衡nginx+tomcat实现动静分离”文章能帮助大家解...
      99+
      2023-06-29
    • 怎么用vbs实现服务器文件备份办法压缩文件名自动按日期命名
      小编给大家分享一下怎么用vbs实现服务器文件备份办法压缩文件名自动按日期命名,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!简单的服务器文件备份办法压缩文件名自动按...
      99+
      2023-06-08
    • 怎么用Spring Cloud Bus实现通知微服务架构的配置文件的更改
      本篇内容主要讲解“怎么用Spring Cloud Bus实现通知微服务架构的配置文件的更改”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Spring Cloud Bus实现通知微服务架构的...
      99+
      2023-06-19
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作