SpringBoot入门之事件监听

  spring boot在启动过程中增加事件监听机制,为用户功能拓展提供极大的便利,sptingboot支持的事件类型有以下五种:

  • ApplicationStartingEvent
  • ApplicationFailedEvent
  • ApplicationPreparedEvent
  • ApplicationReadyEvent
  • ApplicationEnvironmentPreparedEvent

实现监听步骤

  1.监听类实现ApplicationListener接口

  2.将监听类添加到SpringApplication实例中

ApplicationStartingEvent

  ApplicationStartingEvent:springboot启动开始的时候执行的事件,在该事件中可以获取到SpringApplication对象,可做一些执行前的设置。

package com.ysl.listener;

import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.context.event.ApplicationStartingEvent;
import org.springframework.context.ApplicationListener;

/**
 * springboot启动监听类
 */
public class MyApplicationStartingEventListener implements ApplicationListener<ApplicationStartingEvent>{

    @Override
    public void onApplicationEvent(ApplicationStartingEvent applicationStartingEvent) {
        SpringApplication application = applicationStartingEvent.getSpringApplication();
        application.setBannerMode(Banner.Mode.OFF);
        System.out.println("--------- execute MyApplicationStartingEventListener----------");
    }

}
package com.ysl;

import com.ysl.listener.MyApplicationStartingEventListener;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args){
        SpringApplication app =new SpringApplication(Application.class);
        app.addListeners(new MyApplicationStartingEventListener());
        app.run(args);
    }
}

执行结果如下:

--------- execute MyApplicationStartingEventListener----------
2018-03-03 11:00:58.027  INFO 7644 --- [           main] com.ysl.Application                      : Starting Application on master with PID 7644 (/home/workspace/springboottest/target/classes started by ysl in /home/workspace/springboottest)
2018-03-03 11:00:58.032  INFO 7644 --- [           main] com.ysl.Application                      : No active profile set, falling back to default profiles: default
2018-03-03 11:00:58.182  INFO 7644 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot[email protected]1f32bf7: startup date [Sat Mar 03 11:00:58 CST 2018]; root of context hierarchy

ApplicationEnvironmentPreparedEvent

  ApplicationEnvironmentPreparedEvent:spring boot 对应Enviroment已经准备完毕,但此时上下文context还没有创建。在该监听中获取到ConfigurableEnvironment后可以对配置信息做操作,例如:修改默认的配置信息,增加额外的配置信息等等。

package com.ysl.listener;

import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySource;

import java.util.Iterator;

/**
 * spring boot 配置环境事件监听
 */
public class MyApplicationEnvironmentPreparedEventListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent>{

    @Override
    public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
        ConfigurableEnvironment environment = event.getEnvironment();
        MutablePropertySources maps = environment.getPropertySources();
        if(maps != null){
            Iterator<PropertySource<?>> its = maps.iterator();
            while(its.hasNext()){
                PropertySource<?> ps =its.next();
                System.out.print(ps.getName() + "-----");
                System.out.print(ps.getSource() + "-----");
                System.out.println(ps.getClass() + "-----");
            }
        }
    }

}

运行结果

--------- execute MyApplicationStartingEventListener----------
servletConfigInitParams[email protected]class org.springframework.core.env.PropertySource$StubPropertySource-----
servletContextInitParams[email protected]class org.springframework.core.env.PropertySource$StubPropertySource-----

ApplicationPreparedEvent

  ApplicationPreparedEvent:spring boot上下文context创建完成,但此时spring中的bean是没有完全加载完成的。在获取完上下文后,可以将上下文传递出去做一些额外的操作。值得注意的是:在该监听器中是无法获取自定义bean并进行操作的。

package com.ysl.listener;

import org.springframework.boot.context.event.ApplicationPreparedEvent;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
import org.springframework.context.ConfigurableApplicationContext;

public class MyApplicationPreparedEventListener implements ApplicationListener<ApplicationPreparedEvent>{

    @Override
    public void onApplicationEvent(ApplicationPreparedEvent event) {
        ConfigurableApplicationContext context = event.getApplicationContext();
        passContextInfo(context);
    }

    /**
     * 传递上下文
     * @param cac
     */
    private void passContextInfo(ApplicationContext cac) {
        //dosomething()
    }
}

ApplicationFailedEvent

  ApplicationFailedEvent:spring boot启动异常时执行事件,在异常发生时,最好是添加虚拟机对应的钩子进行资源的回收与释放,能友善的处理异常信息

package com.ysl.listener;

import org.springframework.boot.context.event.ApplicationFailedEvent;
import org.springframework.context.ApplicationListener;

public class MyApplicationFailedEventListener implements ApplicationListener<ApplicationFailedEvent> {

    @Override
    public void onApplicationEvent(ApplicationFailedEvent applicationFailedEvent) {
        Throwable t = applicationFailedEvent.getException();
        //do something
    }

}

ApplicationReadyEvent

  ApplicationReadyEvent:springboot 加载完成时候执行的事件

package com.ysl.listener;

import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;

public class MyApplicationReadyEventListener implements ApplicationListener<ApplicationReadyEvent>{
    @Override
    public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {
        applicationReadyEvent.getApplicationContext();
        System.out.println("start ready");
    }
}

运行结果  

2018-03-03 11:19:54.453  INFO 8478 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
2018-03-03 11:19:54.513  INFO 8478 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
start ready
2018-03-03 11:19:54.517  INFO 8478 --- [           main] com.ysl.Application                      : Started Application in 4.718 seconds (JVM running for 5.264)


原文地址:https://www.cnblogs.com/senlinyang/p/8496099.html

时间: 2024-08-04 09:46:28

SpringBoot入门之事件监听的相关文章

Springboot中的事件监听类

SpringBoot启动的时候会调用方法SpringApplicationRunListener#contextLoaded,它包含的事件类如下: EventPublishingRunListener 和 自定义的 SpringApplicationRunListener EventPublishingRunListener 发布 ApplicationPreparedEvent 事件 ConfigFileApplicationListener 监听 ApplicationEvent 事件 处理

SpringBoot事件监听

SpringBoot事件监听 springBoot事件监听流程 1 自定义事件,一般是继承ApplicationEvent抽象类 /** * 定义事件 **/ public class MyApplicationEvent extends ApplicationEvent { private static final long serialVersionUID = 787751246882182041L; public MyApplicationEvent(Object source) { su

Springboot-Listener(springboot的事件监听的4种实现方式)

springboot事件监听的4种方式 第1种: 1.自定义事件MyApplicationEvent继承ApplicationEvent import org.springframework.context.ApplicationEvent; /** * Created by Administrator on 2018\11\13 0013. * 自定义事件继承ApplicationEvent */public class MyApplicationEvent extends Applicati

JAVA入门到精通-第36讲-事件监听-坦克大战4

Java事件处理机制:  事件源:事件:事件监听者:事件处理方法:  任何一个类,只要实现了相应的接口,就可以去监听某个事件源: 一个类要实现监听的基本步骤:  a.实现相应的接口[KeyListener,MouseListener,ActionListener,WindowListener] b.把接口的处理方法根据需要重新编写(override) c.在事件源注册监听 d.事件传递是靠事件对象 通过ActionEvent传递事件: 通过事件进行委派事件模型进行事件处理:  一个事件源可能会生

spring boot 源码赏析之事件监听

使用spring Boot已经快1年多了,期间一直想点开springboot源码查看,但由于种种原因一直未能如愿(主要是人类的惰性...),今天就拿springboot 的监听事件祭刀. springboot 中常用的事件监听主要有ApplicationStartedEvent,ApplicationEnviromentPreparedEvent,ApplicationPreparedEvent,ApplicationStoppedEvent等.用于监听springboot生命周期中的各种事件.

事件监听:诀别Android繁琐的事件注册机制——view.setOnXXXXListener 滚犊子

好久没写过随笔了......windows phone生态没起来,属于.net阵营的我最近工作不是太忙,闲暇之余就心血来潮开始研究安卓.先简单扯两句这几天学习下来对java事件监听机制的一点感触.客观地讲,java的事件监听机制相比.net好原始,暂不说委托.lamda.泛型等的繁琐,仅一个事件监听,就需要各种listener才能实现,比如安卓里到处都是view.setOnXXXXListener.被C#“语法糖”和宇宙第一IDE惯坏的我真心有点不习惯,于是就决定写个工具来封装这些烦人的list

WebView使用详解(二)——WebViewClient与常用事件监听

登录|注册     关闭 启舰 当乌龟有了梦想-- 目录视图 摘要视图 订阅 异步赠书:Kotlin领衔10本好书      免费直播:AI时代,机器学习如何入门?      程序员8月书讯      每周荐书:Java Web.Python极客编程(评论送书) WebView使用详解(二)--WebViewClient与常用事件监听 2016-05-28 11:24 20083人阅读 评论(13) 收藏 举报  分类: 5.andriod开发(148)  版权声明:本文为博主原创文章,未经博主

Node.js 教程 05 - EventEmitter(事件监听/发射器 )

目录: 前言 Node.js事件驱动介绍 Node.js事件 注册并发射自定义Node.js事件 EventEmitter介绍 EventEmitter常用的API error事件 继承EventEmitter 前言: 今天事儿太多了,没有发太多的东西.不好意思了各位. 本篇主要介绍Node.js中的事件驱动,至于Node.js事件概念的东西,太多了. 本系列课程主要抱着的理念就是,让大家慢慢的入门,我也尽量写的简单一点. 所以呢,本文事件驱动,大家的目标应该是:理解Node.js的事件驱动.会

Spring架构揭秘-事件监听机制

一.事件监听机制概述 二.事件监听机制结构 三.Spring监听机制架构 Spring的Application拥有发布事件并且注册事件监听器的能力,拥有一套完整的事件发布和监听机制.在Java中,通过java.util. EventObject来描述事件,通过java.util. EventListener来描述事件监听器,在众多的框架和组件中,建立一套事件机制通常是基于这两个接口来进行扩展. 在一个事件体系中,有以下几个重要的概念. 1.事件源:事件对象的产生者,任何一个EventObject