springboot 事件监听的实现方法

定义事件

@Getter
public class TestEvent extends ApplicationEvent {
 private String msg;

 public TestEvent(Object source, String msg) {
  super(source);
  this.msg = msg;
 }
}

定义事件监听(注解方式)

 @Component
 public class TestListen {
 @EventListener
 public void testListen(TestEvent event) {
  System.out.println(event.getMsg());
 }
}

注意:@Component 注解

发布事件

@Autowired
private ApplicationContext publiser;

@GetMapping("test-listen")
public void testListen() {
 for (int i = 0; i < 10; i++) {
  System.out.println("i = " + i);
 }
 publiser.publishEvent(new TestEvent(this, "测试事件监听"));
 for (int j = 0; j < 10; j++) {
  System.out.println("j = " + j);
 }
}

测试时执行顺序:

  • i循环
  • 打印"event = [测试事件监听]"
  • j循环

异步监听

监听加上@Async注解

@Component
public class TestListen {
 @EventListener
 @Async
 public void testListen(TestEvent event) {
  for (int i = 0; i < 10; i++) {
   System.out.println("event = [" + event.getMsg() + "]");
  }
 }
}

测试时执行顺序:

  • i循环
  • j循环
  • 打印"event = [测试事件监听]"

代码: async

springboot进行事件监听有四种方式:

1.手工向ApplicationContext中添加监听器
2.将监听器装载入spring容器
3.在application.properties中配置监听器
4.通过@EventListener注解实现事件监听

讲到事件监听,这里我们说下自定义事件和自定义监听器类的实现方式:

  • 自定义事件:继承自ApplicationEvent抽象类,然后定义自己的构造器
  • 自定义监听:实现ApplicationListener<T>接口,然后实现onApplicationEvent方法

下面讲下4种事件监听的具体实现

方式1.

首先创建MyListener1类

public class MyListener1 implements ApplicationListener<MyEvent>
{
 Logger logger = Logger.getLogger(MyListener1.class);

 public void onApplicationEvent(MyEvent event)
 {
 logger.info(String.format("%s监听到事件源:%s.", MyListener1.class.getName(), event.getSource()));
 }
}

然后在springboot应用启动类中获取ConfigurableApplicationContext上下文,装载监听

@SpringBootApplication
public class LisenterApplication
{
 public static void main(String[] args)
 {
 ConfigurableApplicationContext context = SpringApplication.run(LisenterApplication.class, args);
 //装载监听
 context.addApplicationListener(new MyListener1());
 }
}

方式2.

创建MyListener2类,并使用@Component注解将该类装载入spring容器中

@Component
public class MyListener2 implements ApplicationListener<MyEvent>
{
 Logger logger = Logger.getLogger(MyListener2.class);

 public void onApplicationEvent(MyEvent event)
 {
 logger.info(String.format("%s监听到事件源:%s.", MyListener2.class.getName(), event.getSource()));
 }
}

方式3.

首先创建MyListener3类

public class MyListener3 implements ApplicationListener<MyEvent>
{
 Logger logger = Logger.getLogger(MyListener3.class);

 public void onApplicationEvent(MyEvent event)
 {
 logger.info(String.format("%s监听到事件源:%s.", MyListener3.class.getName(), event.getSource()));
 }
}

然后在application.properties中配置监听

context.listener.classes=com.listener.MyListener3

方式4.

创建MyListener4类,该类无需实现ApplicationListener接口,使用@EventListener装饰具体方法

@Component
public class MyListener4
{
 Logger logger = Logger.getLogger(MyListener4.class);

 @EventListener
 public void listener(MyEvent event)
 {
 logger.info(String.format("%s监听到事件源:%s.", MyListener4.class.getName(), event.getSource()));
 }
}

自定义事件代码如下:

@SuppressWarnings("serial")
public class MyEvent extends ApplicationEvent
{
 public MyEvent(Object source)
 {
 super(source);
 }
}

进行测试(在启动类中加入发布事件的逻辑):

@SpringBootApplication
public class LisenterApplication
{
 public static void main(String[] args)
 {
 ConfigurableApplicationContext context = SpringApplication.run(LisenterApplication.class, args);
 //装载事件
 context.addApplicationListener(new MyListener1());
 //发布事件
 context.publishEvent(new MyEvent("测试事件."));
 }
}

启动后,日志打印如下:

2018-06-15 10:51:20.198  INFO 4628 --- [           main] com.listener.MyListener3                 : com.listener.MyListener3监听到事件源:测试事件..
2018-06-15 10:51:20.198  INFO 4628 --- [           main] com.listener.MyListener4                 : com.listener.MyListener4监听到事件源:测试事件..
2018-06-15 10:51:20.199  INFO 4628 --- [           main] com.listener.MyListener2                 : com.listener.MyListener2监听到事件源:测试事件..
2018-06-15 10:51:20.199  INFO 4628 --- [           main] com.listener.MyListener1                 : com.listener.MyListener1监

听到事件源:测试事件..

由日志打印可以看出,SpringBoot四种事件的实现方式监听是有序的

完整的代码路径:https://github.com/ingorewho/springboot-develope/tree/master/springboot-listener

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • spring boot之SpringApplication 事件监听

    spring application listener 在 spring 框架中,有多种事件, 这些时间会在不同的运行时刻发布,来通知监听者.本文仅仅介绍 SpringApplicationEvent 的事件的监听. 事件类型 EventType 发布时间 ApplicationContextInitializedEvent 在 SpringApplication正在启动, ApplicationContext 已经准备好了,ApplicationContextInitializers 被调用,

  • Spring Boot的listener(监听器)简单使用实例详解

    监听器(Listener)的注册方法和 Servlet 一样,有两种方式:代码注册或者注解注册 1.代码注册方式 通过代码方式注入过滤器 @Bean public ServletListenerRegistrationBean servletListenerRegistrationBean(){ ServletListenerRegistrationBean servletListenerRegistrationBean = new ServletListenerRegistrationBean

  • Spring boot + LayIM + t-io 实现文件上传、 监听用户状态的实例代码

    前言 今天的主要内容是:LayIM消息中图片,文件的上传对接.用户状态的监听.群在线人数的监听.下面我将挨个介绍. 图片上传 关于Spring boot中的文件上传的博客很多,我也是摘抄了部分代码.上传部分简单介绍,主要介绍在开发过程中遇到的问题.首先我们看一下LayIM的相应的接口: layim.config({ //上传图片接口 ,uploadImage: {url: '/upload/file'} //上传文件接口 ,uploadFile: {url: '/upload/file'} //

  • Spring Boot应用事件监听示例详解

    前言 本文主要给大家介绍了关于Spring Boot应用事件监听的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 1. Spring Boot特有的应用事件 除了Spring框架的事件,Spring Boot的SpringApplication也发送了一些自己的事件: ApplicationStartingEvent:在任何处理(除了注册listener和initializer)开始之前发送. ApplicationEnvironmentPreparedEvent: 在

  • SpringBoot定义过滤器、监听器、拦截器的方法

    一.自定义过滤器 创建一个过滤器,实现javax.servlet.Filter接口,并重写其中的init.doFilter.destory方法. package com.example.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.Se

  • springboot 用监听器统计在线人数案例分析

    本文在springboot 的项目,用HttpSessionListener 监听器(监听器的其中一种) 统计在线人数,实质是统计session 的数量. 思路很简单,但是有个细节没处理好,让我调试了大半天,才把bug搞好. 先写个HttpSessionListener 监听器.count  是session的数量(人数),session 创建的时候,会触发监听器的sessionCreated 方法,session销毁的时候,会触发监听器的sessionDestroyed 方法. 在监听器中计算

  • 浅谈Spring-boot事件监听

    springboot的事件监听:为bean之间的消息通信提供支持.当一个bean做完一件事以后,通知另一个bean知晓并做出相应处理.这时,我们需要另一个bean,监听当前bean所发生的事件. 实现步骤:四个步骤,四种方式 第一种方式 1.自定义事件,一般是继承ApplicationEvent抽象类 2.定义事件监听器,一般是实现ApplicationListener接口 3.1)把监听器加入到SpringApplication中:ApplicationListener.addListener

  • spring boot设置过滤器、监听器及拦截器的方法

    前言 其实这篇文章算不上是springboot的东西,我们在spring普通项目中也是可以直接使用的 设置过滤器: 以前在普通项目中我们要在web.xml中进行filter的配置,但是只从servlet 3.0后,我们就可以在直接在项目中进行filter的设置,因为她提供了一个注解@WebFilter(在javax.servlet.annotation包下),使用这个注解我们就可以进行filter的设置了,同时也解决了我们使用springboot项目没有web.xml的尴尬,使用方法如下所示 @

  • Spring boot通过HttpSessionListener监听器统计在线人数的实现代码

    首先说下,这个统计在线人数有个缺陷,一个人在线可以同时拥有多个session,导致统计有一定的不准确行. 接下来,开始代码的编写, 第一步:实现HttpSessionListener中的方法,加上注解@WebListener @WebListener public class SessionListener implements HttpSessionListener{ public void sessionCreated(HttpSessionEvent arg0) { // TODO Aut

  • springboot 事件监听的实现方法

    定义事件 @Getter public class TestEvent extends ApplicationEvent { private String msg; public TestEvent(Object source, String msg) { super(source); this.msg = msg; } } 定义事件监听(注解方式) @Component public class TestListen { @EventListener public void testListe

  • SpringBoot利用切面注解及反射实现事件监听功能

    目录 前言 效果图 监听原理 核心源码 源码地址 前言 当某个事件需要被监听的时候,我们需要去做其他的事前,最简单的方式就是将自己的业务 方法追加到该事件之后. 但是当有N多个这样的需求的时候我们都这样一个个去添加修改事件的源码吗? 这篇文章将告诉你如何用一个注解,就可以将你的业务代码通过切面的方式添加到事件的前后,而不需要修改事件的代码 效果图 如下图所示,add方法内并没有调用其他的方法,但是其他方法仍然被执行了. 只要给监听方法加@AddEventListener()注解就可以让它在事件前

  • SpringBoot Application事件监听的实现方案

    先说结论 SpringBoot Application共支持6种事件监听,按顺序分别是: ApplicationStartingEvent:在Spring最开始启动的时候触发 ApplicationEnvironmentPreparedEvent:在Spring已经准备好上下文但是上下文尚未创建的时候触发 ApplicationPreparedEvent:在Bean定义加载之后.刷新上下文之前触发 ApplicationStartedEvent:在刷新上下文之后.调用application命令之

  • SpringBoot ApplicationListener事件监听接口使用问题探究

    终日惶惶,不知归路:一日写起代码,突发奇想,若是在运行时发现自定义上下文的数据丢失,我们该如何解决处理数据丢失的问题? 问题复现一下,大家看下面的代码,观察是否有问题,又该如何解决这个问题: @RequestMapping("verify") @RestController @DependsOn({"DingAppInfoService","CloudChatAppInfoService"}) public class LoginAction {

  • php实现事件监听与触发的方法

    本文实例讲述了php实现事件监听与触发的方法.分享给大家供大家参考.具体分析如下: 闲来无事,想了想PHP如何实现事件监听,参考了jQuery的事件绑定思路,简单的实现了一下. 主要功能: 1.绑定事件 支持一个事件绑定多个动作,支持绑定一次性事件 2.触发事件 3.注销事件 复制代码 代码如下: class Event {     protected static $listens       = array();           public static function listen

  • js实现滑动触屏事件监听的方法

    本文实例讲述了js实现滑动触屏事件监听的方法.分享给大家供大家参考.具体实现方法如下: function span_move_fun(){ var span = document.getElementById("move_k"); var span_left = $(span).offset().left; var span_top = $(span).offset().top; var start_left = $(span).offset().left; var start_top

  • C#自定义事件监听实现方法

    本文实例讲述了C#自定义事件监听实现方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApp { /// <summary> /// 定义事件 /// </summary> class CustomEvent { /// <summary> /// 定义委托 /// &

  • Android编程双重单选对话框布局实现与事件监听方法示例

    本文实例讲述了Android编程双重单选对话框布局实现与事件监听方法.分享给大家供大家参考,具体如下: 首先是自定义XML布局代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_pare

  • JavaScript实现为事件句柄绑定监听函数的方法分析

    本文实例讲述了JavaScript实现为事件句柄绑定监听函数的方法.分享给大家供大家参考,具体如下: 在JavaScript中为Dom元素绑定事件监听函数是一件非常常见的事情,但这里也有许多的Bug.各种浏览器对于事件绑定都提供了很多方法,但可靠的只有3中: 1.传统的绑定方法: elem.onclick = function( event ){ alert(event.type + 'this.innerHTML'); }; a.传统的绑定方法,非常简单稳定,函数体内的this指向的也是指向正

随机推荐