Spring中的ApplicationRunner接口的使用详解

 更新时间:2023年11月03日 08:45:43   作者:wh柒八九  
这篇文章主要介绍了Spring中的ApplicationRunner接口的使用详解,ApplicationRunner使用起来很简单,只需要实现CommandLineRunner或者ApplicationRunner接口,重写run方法就行,需要的朋友可以参考下

ApplicationRunner

使用起来很简单,只需要实现CommandLineRunner或者ApplicationRunner接口,重写run方法就行。

在springboot完全初始化完毕后,会执行CommandLineRunner和ApplicationRunner,两者唯一的区别是参数不同,但是不会影响,都可以获取到执行参数

代码实例

package com.wideth.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

/***
 * 在springboot完全初始化完毕后,
 * 会执行CommandLineRunner和ApplicationRunner,
 * 两者唯一的区别是参数不同,但是不会影响,都可以获取到执行参数。
 */
@Slf4j
@Component
public class MyApplicationRunner implements ApplicationRunner {


    @Override
    public void run(ApplicationArguments args){

        log.info("====>>> MyApplicationRunner.run()正在执行=========");
    }
}

程序结果

在这里插入图片描述

CommandLineRunner

代码实例

package com.wideth.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

/***
 * 在springboot完全初始化完毕后,
 * 会执行CommandLineRunner和ApplicationRunner,
 * 两者唯一的区别是参数不同,但是不会影响,都可以获取到执行参数。
 */
@Slf4j
@Component
public class MyCommandLineRunner implements CommandLineRunner {


    @Override
    public void run(String... args){

        log.info("====>>> MyCommandLineRunner.run()正在执行=========");
    }
}

程序结果

在这里插入图片描述

ApplicationListener

通过事件监听我们也可以实现springboot启动执行方法。实现ApplicationListener,重写onApplicationEvent方法,便可在所有的bean加载完毕后执行。

触发时机

在IOC的容器的启动过程,当所有的bean都已经处理完成之后,spring ioc容器会有一个发布ContextRefreshedEvent事件的动作。

使用实例

package com.wideth.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

/***
 * 在IOC的容器的启动过程,
 * 当所有的bean都已经处理完成之后,
 * spring ioc容器会有一个发布
 * ContextRefreshedEvent事件的动作。
 */
@Slf4j
@Component
public class MyApplicationListener implements ApplicationListener<ContextRefreshedEvent> {


    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {

        log.info("====>>> MyApplicationListener.onApplicationEvent()正在执行=========");
    }
}

程序结果

在这里插入图片描述

注意问题

系统会存在两个容器,一个是root application context ,另一个就是我们自己的 projectName-servlet context(作为root application context的子容器)

这种情况下,就会造成onApplicationEvent方法被执行两次。为了避免上面提到的问题,我们可以只在root application context初始化完成后调用逻辑代码,其他的容器的初始化完成,则不做任何处理

  //root application context 没有parent
 if (event.getApplicationContext().getParent() == null) { 
 
    //逻辑代码
  }

到此这篇关于Spring中的ApplicationRunner接口的使用详解的文章就介绍到这了,更多相关ApplicationRunner接口的使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入了解Java核心类库--BigDecimal和System类

    深入了解Java核心类库--BigDecimal和System类

    这篇文章主要为大家详细介绍了javaBigDecimal和System类定义与使用的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能给你带来帮助
    2021-07-07
  • 阅读EnumSet抽象类源码

    阅读EnumSet抽象类源码

    这篇文章主要介绍了阅读EnumSet抽象类源码,具有一定参考价值,需要的朋友可以了解下。
    2017-12-12
  • IDEA2020配置Git的方法步骤

    IDEA2020配置Git的方法步骤

    这篇文章主要介绍了IDEA2020配置Git的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • spring boot + mybatis实现动态切换数据源实例代码

    spring boot + mybatis实现动态切换数据源实例代码

    这篇文章主要给大家介绍了关于spring boot + mybatis实现动态切换数据源的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • java分形绘制科赫雪花曲线(科赫曲线)代码分享

    java分形绘制科赫雪花曲线(科赫曲线)代码分享

    部分与整体以某种形式相似的形,称为分形,科赫曲线是一种外形像雪花的几何曲线,所以又称为雪花曲线,它是分形曲线中的一种,画法如下
    2013-12-12
  • Java实现简单GUI登录和注册界面

    Java实现简单GUI登录和注册界面

    这篇文章主要为大家详细介绍了Java实现简单GUI登录和注册界面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • java HttpClient传输json格式的参数实例讲解

    java HttpClient传输json格式的参数实例讲解

    这篇文章主要介绍了java HttpClient传输json格式的参数实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Java中this和super关键字的使用详解

    Java中this和super关键字的使用详解

    super 代表父类的存储空间标识(可以理解为父亲的引用)。 this代表当前对象的引用(谁调用就代表谁)。本文将通过简单的示例介绍二者的使用与区别,需要的可以了解一下
    2022-10-10
  • java多线程编程之从线程返回数据的两种方法

    java多线程编程之从线程返回数据的两种方法

    从线程中返回数据和向线程传递数据类似。也可以通过类成员以及回调函数来返回数据。但类成员在返回数据和传递数据时有一些区别,下面让我们来看看它们区别在哪
    2014-01-01
  • Java web含验证码及权限登录实例代码

    Java web含验证码及权限登录实例代码

    这篇文章主要介绍了Java web含验证码及权限登录实例代码,所用到的开发工具为myeclipse10,MySQL数据库,具体实现代码大家参考下本文吧
    2017-03-03

最新评论