前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot的多种事件监听机制

SpringBoot的多种事件监听机制

作者头像
忧愁的chafry
发布2022-10-30 16:31:51
4130
发布2022-10-30 16:31:51
举报
文章被收录于专栏:个人技术笔记个人技术笔记

前置配置

代码语言:javascript
复制
# META-INF/spring.factories文件配置
# ApplicationContextInitializer
org.springframework.context.ApplicationContextInitializer=com.test.springbootdemo.eventListeners.MyApplicationContextInitializer
# ApplicationListener
org.springframework.context.ApplicationListener=com.test.springbootdemo.eventListeners.MyApplicationListener
# SpringApplicationRunListener
org.springframework.boot.SpringApplicationRunListener=com.test.springbootdemo.eventListeners.MySpringApplicationRunListener

ApplicationContextInitializer接口

代码示例

代码语言:javascript
复制
public class MyApplicationContextInitializer implements ApplicationContextInitializer {
    //run方法this.prepareContext触发
    //进一步则是this.applyInitializers
    //在进一步则是initializer.initialize(context);
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        System.out.println("ApplicationContextInitializer.....initialize");
    }
}

说明

  1.由于触发阶段在于准备容器的时候,所以添加@Component注解是不会起作用的,应为@Component注解需要在容器刷新时候才会起到作用。

ApplicationListener接口

代码示例

代码语言:javascript
复制
public class MyApplicationListener implements ApplicationListener {
    //run方法listeners.starting,触发第一次
    //run方法this.prepareEnvironment,触发第二次
    //即进一步,listeners.environmentPrepared
    //run方法this.prepareContext,触发第三次与触发第四次
    //进一步则是listeners.contextPrepared(context);触发第三次
    // listeners.contextLoaded(context);触发第四次
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof ContextStartedEvent){
            System.out.println("ContextStartedEvent1.....run()");
        }

        System.out.println("Event1.....run()");

    }
}

@Component
public class MyApplicationListener2 implements ApplicationListener {
    //容器refresh()的时候触发
    //进一步finishRefresh();
    //再进一步getLifecycleProcessor().onRefresh();
    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof ContextStartedEvent){
            System.out.println("ContextStartedEvent2.....run()");
        }

        System.out.println("Event2.....run()");
    }
}

说明

  1.存在两种注册方式:

    1)@Component注解注册,这种需要在容器刷新后的finishRefresh()方法里面触发,然后监听到全部事件

    2)配置文件注册,这种会在SpringBoot中开启listeners,让listeners准备环境,准备容器等都会触发。包括容器刷新后的finishRefresh()方法里面都会触发【包括了注解修饰的部分】

ApplicationRunner接口

代码示例

代码语言:javascript
复制
@Component
public class MyApplicationRunner implements ApplicationRunner {
    //run方法this.callRunners,第一次触发
    //进一步,this.callRunner
    //在进一步,runner.run(args);
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("ApplicationRunner.....run()");
    }
}

说明

  1.这种只能在容器启动后进行触发

  2.与CommandLineRunner接口其实并没有很大差别,都在同一个方法内被调用,调用同一个触发方法。但是会优于CommandLineRunner被调用。

CommandLineRunner接口

代码示例

代码语言:javascript
复制
@Component
public class MyCommandLineRunner implements CommandLineRunner {
    //run方法this.callRunners,第一次触发
    //进一步,this.callRunner
    //在进一步,runner.run(args);
    @Override
    public void run(String... args) throws Exception {
        System.out.println("CommandLineRunner.....run()");
    }
}

说明

  1.这种只能在容器启动后进行触发

  2.与ApplicationRunner接口其实并没有很大差别,都在同一个方法内被调用,调用同一个触发方法。但是会晚于ApplicationRunner被调用。

SpringApplicationRunListener接口

代码示例

代码语言:javascript
复制
public class MySpringApplicationRunListener implements SpringApplicationRunListener {
    public MySpringApplicationRunListener(SpringApplication springApplication, String[] arg) {
    }

    //run方法listeners.starting触发
    @Override
    public void starting(ConfigurableBootstrapContext bootstrapContext) {
        System.out.println("SpringApplicationRunListener.....starting()");
    }

    //run方法this.prepareEnvironment触发
    //进一步listeners.environmentPrepared
    @Override
    public void environmentPrepared(ConfigurableBootstrapContext bootstrapContext, ConfigurableEnvironment environment) {
        System.out.println("SpringApplicationRunListener.....environmentPrepared()");
    }

    //run方法this.prepareContext触发
    //进一步listeners.contextPrepared(context);
    @Override
    public void contextPrepared(ConfigurableApplicationContext context) {
        System.out.println("SpringApplicationRunListener.....contextPrepared()");
    }

    //run方法this.prepareContext触发
    //进一步listeners.contextLoaded(context);
    @Override
    public void contextLoaded(ConfigurableApplicationContext context) {
        System.out.println("SpringApplicationRunListener.....contextLoaded()");
    }

    //run方法listeners.started(context, timeTakenToStartup);触发
    @Override
    public void started(ConfigurableApplicationContext context, Duration timeTaken) {
        System.out.println("SpringApplicationRunListener.....started()");
    }

    @Override
    public void started(ConfigurableApplicationContext context) {
        System.out.println("SpringApplicationRunListener.....started()");
    }

    //run方法listeners.ready(context, timeTakenToReady);触发
    @Override
    public void ready(ConfigurableApplicationContext context, Duration timeTaken) {
        System.out.println("SpringApplicationRunListener.....ready()");
    }

    @Override
    public void running(ConfigurableApplicationContext context) {
        System.out.println("SpringApplicationRunListener.....running()");
    }

    @Override
    public void failed(ConfigurableApplicationContext context, Throwable exception) {
        System.out.println("SpringApplicationRunListener.....failed()");
    }
}

说明

  1.这个比较有意思在容器Refresh()前后都会触发,包括各种处理环境,准备容器等步骤。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-10-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前置配置
  • ApplicationContextInitializer接口
  • ApplicationListener接口
  • ApplicationRunner接口
  • CommandLineRunner接口
  • SpringApplicationRunListener接口
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档