当实现ApplicationListener接口的监听器

spring事件监听器系列三:通过ApplicationListener接口方式实现监听器源码 前面有介绍了@EventListener注解方式的源码,这篇笔记主要来记录通过实现ApplicationListener接口这种方式实现事件监听器的原理 具体的流程,前面博客中,有插入一个截图,我们这篇博客中,主要介绍解析的细节,具体的流程,就不在这里叙述,在上一篇博客中有记录整个流程 解析ApplicationListener实现类源码 org.springframework.context.support.ApplicationListenerDetector#postProcessAfterIniti 阅读详情
添加上如下这个类,会使监听器中onApplicationEvent()方法,以异步的方法执行

package xxx.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ApplicationEventMulticaster;
import org.springframework.context.event.SimpleApplicationEventMulticaster;
import org.springframework.core.task.SimpleAsyncTaskExecutor;

@Configuration
public class AsyncEventConfig {

    @Bean(name = "applicationEventMulticaster")
    public ApplicationEventMulticaster simpleApplicationEventMulticaster() {
        SimpleApplicationEventMulticaster eventMulticaster
                = new SimpleApplicationEventMulticaster();

        eventMulticaster.setTaskExecutor(new SimpleAsyncTaskExecutor());
        return eventMulticaster;
    }
}

 

//自定义事件类
package xxx.init;

import org.springframework.context.ApplicationEvent;

public class MyApplicationEvent extends ApplicationEvent {
    private String message;
    public MyApplicationEvent(Object source,String message) {
        super(source);
        this.message = message;
    }
    public String getMessage() {
        return message;
    }
}

//自定义监听器

package xxx.init;

import xxx.constant.Tag;
import xxx.impl.MQFactory;
import xxx.interfaces.IMQComsumer;
import xxx.interfaces.IMQProducer;
import xxx.interfaces.Ibusiness;
import org.apache.rocketmq.client.exception.MQClientException;
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.ContextStartedEvent;
import org.springframework.stereotype.Component;

@Component
public class MyListener implements ApplicationListener<MyApplicationEvent> {

    @Override
    public void onApplicationEvent(MyApplicationEvent event) {

        System.out.println(event.getMessage());
        System.out.println("bbbbbbbbbbbbb");

        while (true){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

}

 

 

 

package xxx.init;

import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
//该监听器支持异步处理即doMethod方法是异步执行,不影响service中的方法,是在不同的线程中执行的。
//需要在springboot的启动类上开启@EnableAsync注解
@Component
public class PtListener {
    @Async
    @EventListener
    public void doMethod(MyApplicationEvent event){

        event.getMessage();
        while (true){
            System.out.println("in listener method");
        }


    }
}

 

 

package xxx.web;

import xxx.init.MyApplicationEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    @Autowired
    private ApplicationEventPublisher context;
    @GetMapping("/getTest")
    public String testMethod(){
        MyApplicationEvent demoEvent = new MyApplicationEvent(this,"测试消息");
        context.publishEvent(demoEvent);//发送一个消息(即触发一个MyApplicationEvent事件,会触发监听器PtListener 的doMethod方法执行或者触发MyListener类的onApplicationEvent方法执行)
        System.out.println("main()");
        return "abc";
    }
}
/////////////////////////////////////////////////////////////////////////////////


package xxx.init;


import xxx.constant.Tag;
import xxx.impl.MQFactory;
import xxx.interfaces.IMQComsumer;
import xxx.interfaces.IMQProducer;
import xxx.interfaces.Ibusiness;
import org.apache.rocketmq.client.exception.MQClientException;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ApplicationContextEvent;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.ContextStartedEvent;

//监听ContextRefreshedEvent事件时,有可能会被触发多次。比如说,在我们的service中@AutoWired第三方的jar包中的feignClient
时。可以通过if(contextRefreshedEvent.getApplicationContext().getParent().getId().equals("bootstrap"))这个条件判断来过滤掉这些多余的触发调用。只调用一次onApplicationEvent方法。
public class ProduceAndConsumerInit implements ApplicationListener<ContextRefreshedEvent> {

    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        if(contextRefreshedEvent.getApplicationContext().getParent().getId().equals("bootstrap"))
        {
            String type = contextRefreshedEvent.getApplicationContext().getEnvironment().getProperty("mq.Type");
            String address = contextRefreshedEvent.getApplicationContext().getEnvironment().getProperty("rocketmq.nameServeraddr");
            String topic = contextRefreshedEvent.getApplicationContext().getEnvironment().getProperty("rocketmq.topic");

            IMQProducer producer = MQFactory.getMQProducer(type,address,topic+"_"+ Tag.getName(5));
            try {
                producer.start();
            } catch (MQClientException e) {
                e.printStackTrace();
            }

            Ibusiness businessImpl = (Ibusiness)contextRefreshedEvent.getApplicationContext().getBean("serviceBusinessImpl");
            IMQComsumer comsumer = MQFactory.getMQComsumer(type,address, businessImpl,topic+"_"+Tag.getName(4),topic, Tag.getName(4), Tag.getName(5),true, producer);          
        }

    }

}
Spring中ApplicationListener源码分析 说ApplicationListener之前先要知道EventListener。EventListener本身是一个接口,它的作用跟前面讲到的Aware类似,都是只定义最顶级的接口,并没有实习对应的方法,并且该接口也是由JDK提供的,并不是直接由Spring提供,Spring只是基于该接口实现了自己的一套事件监听功能。在Spring中实现事件监听的接口是ApplicationListener,该接口继承了EventListener,并做了对应的实现。/***/复制代码。 阅读详情

相关推荐

Spring Boot 监听器详解

SpringApplicationRunListener 是SpringApplication 的运行监听器,提供Spring Boot启动时各个运行状态的监听,可以在应用程序启动的时候执行一些自定义操作或记录一些信息。SpringApplicationRunListener 在run中加载。是Spring 提供的上下文监听器,可用于监听指定感兴趣的事件。最后还是用一张图来总结整个流程作者其他文章:Prometheus 系列文章Prometheus 的介绍和安装。

分享技术干货和灵感、推荐新书和好玩的项目、分享Java面试题 8818

RocketMQ源码学习六:Producer端消息发送

发送消息前会对topic和消息体做校验,消息不能大于4m,topic名称长度不能大于127发送过程中如果异常,使用for循环的方式做了重试。同步发送的重试次数是3,异步发送的重试次数是1发送前会初始化topic路由信息,里边包含发送的broker地址,对应的队列,读写队列的个数等信息如果发送失败的会放到故障延时队列,重试时topic会尝试拿上次失败的broker发送设置uniqID,用于判断消息发送是否重复发送,延迟发送,超前发送。

qq_27586963的博客 458

Maya绑定:人物绑定详细案例(创建骨骼、镜像骨骼、IK创建、IK打组、IK控制器、FK控制器、烘焙动画、导出)

Maya绑定:人物绑定详细案例(创建骨骼、镜像骨骼、IK创建、IK打组、IK控制器、FK控制器、烘焙动画、导出)

m0_45877477的博客 1633

RabbitMQ入门教程之二--》spring+rabbitmq简单demo

1. maven工程的pom文件需要添加的依赖 org.springframework.amqp spring-rabbit 1.6.3.RELEASE +spring的全部依赖+jackson相关的依赖 2. spring-config.xml需要添加的配置如下: <rabbit:connection-factory id="connec

wwHRestarting的博客 2259

Excel COUNTIF函数精确统计全解析:从模糊匹配到精准计数

在数据处理与办公自动化领域,条件计数是数据分析的基础操作,其核心原理在于对特定范围内满足设定条件的单元格进行识别与汇总。Excel中的COUNTIF函数是实现这一功能的常用工具,它通过文本匹配逻辑与通配符机制来执行条件判断。然而,其默认的模糊匹配行为常导致统计结果偏离预期,这正是精确统计的技术价值所在——确保数据汇总的准确性与可靠性,直接影响业务报告、薪酬核算、销售分析等应用场景的决策质量。本文聚焦COUNTIF函数的精确匹配技巧,深入剖析通配符(如星号*和问号?)的转义使用(通过波浪号~),并针对大小写敏

weixin_29040367的博客 356

5分钟搞定!用Cursor和.NET 9.0快速搭建串口通讯上位机(附VS Code插件配置)

本文分享了如何利用Cursor AI编程助手与.NET 9.0,在5分钟内快速构建一个功能完整的串口通讯上位机程序。通过自然语言描述需求,AI自动生成WinForms界面和核心代码,极大提升了硬件调试工具的定制开发效率。文章详细介绍了环境配置、AI协作编码、功能实现与调试的全过程。

weixin_28366353的博客 276

SpringBoot 异步事件实现异步(ApplicationEventPublisher、ApplicationEvent)

SpringBoot 异步事件实现异步(ApplicationEventPublisher、ApplicationEvent) ​ 当把一个事件发布到Spring提供的ApplicationContext中,被监听器侦测到,就会执行对应的处理方法。 实现步骤: 自定义发布的事件类,需要继承 ApplicationEvent 或者PayloadApplicationEvent(该类也仅仅是对A...

gu_zhou的博客 1万+

AI医疗影像诊断工具2025 完整教程

本教程所述工具均为辅助诊断设备,不可替代执业医师判断。部署使用需遵守当地医疗器械管理法规。推荐开源框架组合:代码太多打包上传网盘了 自行下载。2025年的AI医疗影像诊断工具将以。

m0_60084632的博客 2029

ApplicationEvent 与ApplicationListener 异步化执行测试

目录 定义事件 定义监听 设置配置 Junit测试 异步执行使用@EnableAsync开启方法异步,在需要异步执行的方法上设置@Async即可。 定义事件 分别定义A、B、C 三类事件:没有特别的都是一个默认构造。 定义监听 这里可以测试两个场景: 包含@Async 不包含@Async 设置配置 Junit测试 非@Async场景是顺序执行,而@Async是异步执行。 ...

纸上得来终觉浅,绝知此事要躬行 966

【WSL】window11 安装WSL2配置conda环境及mlatom环境搭建

写这篇文章之前自己安装过两次环境,可能每次都会产生碰到同样的问题,为了搭建适合自己的虚拟环境保证每一步的正确性,按顺序记录一下。

wangxiancao的博客 1629

百度百科 X-Bk-Token 算法还原

百度百科 X-Bk-Token 算法还原

自成背后的博客 1万+

分布式消息队列XXL-MQ

《分布式消息队列XXL-MQ》 一、简介 1.1 概述 XXL-MQ是一款轻量级分布式消息队列,支持 "并发消息、串行消息、广播消息、延迟消息、事务消息、失败重试、超时控制" 等消息特性。现已开放源代码,开箱即用。 1.2 特性 1、简单易用: 一行代码即可发布一条消息; 一行注解即可订阅一个消息主题; 2、轻量级: 部署简单,不依赖第三方服务,一分钟上手;...

weixin_30535167的博客 398

OpenOCD入门到精通:第28章 综合实战:RISC-V 调试

RISC-V调试实战摘要 本文介绍了RISC-V调试规范及其在OpenOCD中的实现。主要内容包括: RISC-V Debug规范的两个版本(0.11和0.13)及其差异,OpenOCD通过自动检测DTMCS寄存器版本号选择对应驱动实现。 RISC-V调试架构的分层设计,包含DTM、Debug Module、Program Buffer等核心组件,以及三种内存访问方式(progbuf、sysbus、abstract)。 以GD32VF103为例的实战调试配置,包括硬件连接、OpenOCD配置文件编写和GDB

从事嵌入式linux android驱动开发,拥有全栈能力 282

通过实现ApplicationListener接口创建监听器

实现ApplicationListener接口,覆写onApplicationEvent(ApplicationEvent event)方法 @Component public class MyApplicationListener implements ApplicationListener { @Override public void onApplicationEvent...

qq_30166729的博客 458

【第一章】核心思维:那个在此刻“消失”的 CPU

摘要:RTOS本质是"有状态的抢占"而非"多任务",单核MCU通过时间片分时复用实现任务切换。裸机编程的线性思维在RTOS中不再适用,开发者需接受代码随时被打断的现实。RTOS通过保存/恢复CPU寄存器组(上下文)实现任务切换,每个任务拥有独立栈空间。非原子操作(如全局变量自增)会导致竞态条件,必须使用临界区或互斥锁保护。RTOS编程需要建立并发思维,关注代码原子性、可重入性和栈空间分配。

一路往蓝-Anbo 的博客 105

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【springboot高级】(二:自定义系统监听器,实现ApplicationListener接口。(使用篇))

springboot在系统启动的时候,提供了很多的监听,有时候我们需要根据一些业务,在启动的时候监听springboot启动的某个节点,然后做相应的事情,那么这节就来讲一下如何实现自定义监听器,在springboot发送事件的时候,我们能够监听到。 (注意:自定义监听器和自定义初始化器原理一波一样,方式也是一模一样,如果需要看自定义初始化器的,可以查看【springboot高级】(一:自定义容器初始化器的三种方式,实现ApplicationContextInitializer接口。(使用篇))) 首先我们需

CoderOu 1248

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【spring源码】十二、监听器

spring监听器 一、ApplicationListener接口 作用:监听容器中发布的事件,完成事件驱动开发 实现ApplicationListener接口 //如果要写实现类就得实现这个接口 public interface ApplicationListener<E extends ApplicationEvent> //泛型是要监听的事件,监听ApplicationEvent及其下面的子事件。即我们要发布事件,这个事件应该是ApplicationEvent的子类 extends

努力充实,远方可期 1030

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Spring ApplicationListener 使用指南

首先,我们需要创建一个自定义类来实现接口。这个接口只有一个方法,该方法会在事件发布时被调用,其参数为发布的事件对象。@OverrideSystem.out.println("容器初始化成功");System.out.println("容器停止");为我们提供了一种在 Spring 应用中进行事件驱动开发的有效方式。通过监听容器发布的各种事件,我们可以在合适的时机执行自定义代码,如加载资源、启动定时任务等。使用确保 Spring 容器能够识别并加载我们的监听器。

m0_57836225的博客 1168

Spring注解驱动开发第38讲——你知道ApplicationListener的用法吗?

写在前面 在前面两讲中,我们学习了一下Spring扩展原理里面的BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor。在这一讲中,我们将会学习一下Spring剩余其他扩展原理里面的ApplicationListener。 你不知道的ApplicationListener ApplicationListener的概述 ApplicationListener按照字面意思,它应该是Spring里面的应用监听器,也就是Spring为我们提供的基于事

李阿昀的博客 4533

Spring监听器用法与原理详解(带ApplicationListener模型图)

相信大家都或多或少知道Spring中的监听器,有些人还能说出它采用了观察者模式,但其实它还用到了适配器模式工厂模式等。当然,仍有不少人是完全不了解Spring的监听及其机制的,本次我们就来深入学习一下Spring监听器观察者模式(Observer Pattern)是一种行为设计模式,它用于在对象之间建立一对多的依赖关系。在该模式中,当一个对象的状态发生变化时,它会自动通知其依赖对象(称为观察者),使它们能够自动更新主题对象维护一个观察者列表,并提供方法用于添加和删除观察者。当主题的状态发生变化时,它会。

战斧的博客 1万+

ApplicationContext 与 ApplicationEvent 与 ApplicationListener

ApplicationContext? 它是Spring的核心,Context我们通常解释为上下文环境,但是理解成容器会更好些。 ApplicationContext则是应用的容器。 Spring把Bean(object)放在容器中,需要用就通过get方法取出来。 ApplicationEvent 是个抽象类,里面只有一个构造函数和一个长整型的timestamp。 ApplicationListe...

QAQ123666的博客 682

springboot监听器实现

自定义监听器 要在springboot中注入自定义的监听器,需要完成以下两个步骤 实现接口 注入框架 实现接口 第一种【实现ApplicationListener接口】 实现ApplicationListener接口 在实现时声明支持的事件 // 示例中ApplicationStartedEvent就是声明的支持的事件,监听器将会在监听到该事件后打印出"hello world" publi...

z13192905903的博客 2859

Spring Boot2实战及核心源码讲解(持续更新,敬请关注)——监听器——ApplicationListener(实战篇)

监听器模式的设计思路大致就是,事件发布者根据不同场景发布事件至广播器,广播器将事件对监听器进行广播,监听器对感兴趣的事件进行处理。以上就是监听器实战篇的全部内容。上文说过,监听器的注入和初始化器的注入相似,那么这两者的实现原理是否相同呢,答案是肯定的,感兴趣的朋友可以去看初始化器篇,会有详细的原理讲解。而埋伏在Spring Boot框架中的事件发布者以及广播器又是如何实现监听器的收集以及事件的广播的呢?答案会在监听器源码篇解答,欢迎阅读。

weixin_45200938的博客 1439

SpringBoot2.X之旅,实现ApplicationListener,监听程序启动过程(Web Project)

背景需求: 由于项目启动时,需要自动加载初始化一些数据,这时候可以使用监听类 一、定义监听类,实现ApplicationListener接口: package com.cobra.webdemo.listener; import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent; impo...

八轮_Baron的博客 2123

Spring中ApplicationListener的使用

背景 ApplicationListener是Spring事件机制的一部分,与抽象类ApplicationEvent类配合来完成ApplicationContext的事件机制。 如果容器中存在ApplicationListener的Bean,当ApplicationContext调用publishEvent方法时,对应的Bean会被触发。这一过程是典型的观察者模式的实现。 ApplicationL...

程序新视界 4708

ApplicationListener监听器使用介绍,@Order加载顺序无效解析

ApplicationListener是Spring事件机制的一部分,与抽象类ApplicationEvent类配合来完成ApplicationContext的事件发布订阅机制。 ApplicationEvent package com.example.demo.event; import org.springframework.context.ApplicationEvent; /** * @author huangd * @date 2021-11-09 **/ public class Ob

huangdi1309的博客 3746
上一篇: ajax 调用SpringBoot中的restful接口 两个ajax分别请求两个不同的接口,要使两个接口中的session是同一个(session共享)
下一篇: ajax 请求 springboot中的Controller ,ajax请求url中的 localhost 和 127.0.0.1不同源,跨域问题导致报错
rabbit0708
博客等级 码龄15年 12粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值