guava eventbus

news/2024/5/3 0:54:56/文章来源:https://blog.csdn.net/weixin_43476824/article/details/130020698

EventBus 是 Guava 的事件处理机制,是观察者模式(生产/消费模型)的一种实现。根据发送对象的类型,查找所有匹配的订阅处理器进行处理。

1. 默认当前线程直接调用

1.1.简单使用示例

package org.example.model.guava;import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.junit.Test;public class EventBusTest {@AllArgsConstructor@Datapublic static class Person {private String name;private int age;}public static class SimpleListener {@Subscribe// Subscribe注解标注的方法为订阅处理器,处理String类型的事件public void doSomething(String event) {System.out.println(this.getClass().getSimpleName() + ":" + event);}@Subscribepublic void doSomething2(String event) {System.out.println(this.getClass().getSimpleName() + "2:" + event);}@Subscribe// 订阅处理Person类型的事件public void personListener(Person person) {System.out.println(this.getClass().getSimpleName() + ":" + person);}}@Testpublic void test() {EventBus eventBus = new EventBus();// 注解监听者eventBus.register(new SimpleListener());// 发送事件eventBus.post("发送字符串!");eventBus.post(new Person("张三", 20));}
}

执行结果:

SimpleListener2:发送字符串!
SimpleListener:发送字符串!
SimpleListener:EventBusTest.Person(name=张三, age=20)

1.2 监听器有继承关系时

    监听器有继承关系时,父类和子类所有被Subscribe注解标记的方法都会被注册为事件订阅处理器。

package org.example.model.guava;import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.junit.Test;public class EventBusTest {@AllArgsConstructor@Datapublic static class Person {private String name;private int age;}public static abstract class absListener {@Subscribepublic void doSomething2(String event) {System.out.println(this.getClass().getSimpleName() + "2:" + event);}@Subscribepublic void personListener(Person person) {System.out.println(this.getClass().getSimpleName() + ":" + person);}}public static class SimpleListener extends absListener {@Subscribepublic void doSomething(String event) {System.out.println(this.getClass().getSimpleName() + ":" + event);}}@Testpublic void test() {EventBus eventBus = new EventBus();eventBus.register(new SimpleListener());eventBus.post("发送字符串!");eventBus.post(new Person("张三", 20));}
}

执行结果:

SimpleListener:发送字符串!
SimpleListener2:发送字符串!
SimpleListener:EventBusTest.Person(name=张三, age=20)

1.3 事件对象有继承关系时

    事件对象有继承关系时,由于子类型可以转换为父类型,订阅父类型的处理器可以订阅到子类型进行处理:

package org.example.model.guava;import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.experimental.SuperBuilder;
import org.junit.Test;public class EventBusTest {@AllArgsConstructor@SuperBuilder@Datapublic static class Person {private String name;private int age;}@SuperBuilder()public static class Man extends Person {}public static class SimpleListener {@Subscribepublic void personListener(Person person) {System.out.println(this.getClass().getSimpleName() + "---Person:" + person);}@Subscribepublic void manListener(Man man) {System.out.println(this.getClass().getSimpleName() + "---Man:" + man);}}@Testpublic void test() {EventBus eventBus = new EventBus();eventBus.register(new SimpleListener());eventBus.post(Man.builder().name("张三").age(20).build());}
}

执行结果:

SimpleListener---Man:EventBusTest.Person(name=张三, age=20)
SimpleListener---Person:EventBusTest.Person(name=张三, age=20)

1.4 订阅处理器执行异常不会影响其他订阅处理器执行

package org.example.model.guava;import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import org.junit.Test;public class EventBusTest {public static class SimpleListener {@Subscribepublic void listener1(String event) {System.out.println(this.getClass().getSimpleName() + "---1111:" + event);throw new RuntimeException();}@Subscribepublic void listener2(String event) {System.out.println(this.getClass().getSimpleName() + "---2222:" + event);}}@Testpublic void test() {EventBus eventBus = new EventBus();eventBus.register(new SimpleListener());eventBus.post("异常测试");}
}

执行结果:

 listener1异常并没有影响listener2的执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_283306.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux·深入理解 ext4 等 Linux 文件系统

了解 ext4 的历史,包括其与 ext3 和之前的其它文件系统之间的区别。目前的大部分 Linux 文件系统都默认采用 ext4 文件系统,正如以前的 Linux 发行版默认使用 ext3、ext2 以及更久前的 ext。 对于不熟悉 Linux 或文件系统的朋友而言,你可能不…

ChatGPT体验地址,超多功能,附公众号源码

GPT说明效果演示地址体验公众号源码说明 ChatGPT是一种基于深度学习的自然语言处理(NLP)技术,它可以实现自然的文字对话。ChatGPT是基于预训练的语言模型,使用大量的数据和计算资源进行训练,使其能够理解和生成自然语…

2018年 团体程序设计天梯赛——题解集

前言: Hello各位童学大家好!😊😊,茫茫题海你我相遇即是缘分呐,或许日复一日的刷题已经让你感到疲惫甚至厌倦了,但是我们真的真的已经达到了我们自身极限了吗?少一点自我感动&#xf…

【C++】list的模拟实现及其应用

文章目录list的相关介绍list的使用list构造list iterator的使用list capacitylist element accesslist modifierslist迭代器失效sort问题list模拟实现的完整代码list与vector的对比list的相关介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且…

[linux kernel]slub内存管理分析(5) kfree

文章目录背景省流前情回顾描述方法约定kfree 操作总览简介逻辑图预览释放逻辑slab page各个状态转化调用栈详细分析kfreeslab_free__slab_freeput_cpu_partialunfreeze_partialsdiscard_slab->free_slab内存释放逻辑总结slab page状态转换关系图背景 省流 如果对代码细节不…

21.SSM框架-SpringMVC

目录 一、SpringMVC。 (1)SpringMVC快速入门。 (2)SpringMVC的数据响应方式。 (1)页面跳转。 (2)回写数据。 (3)获取请求参数。 (4&#xf…

SpringSecurity实战解析

文章目录一、Security认证和原理1、认证基本流程1.1 表单认证概述1.2 基本流程分析1.3 权限访问流程2、请求间共享认证信息2.1 概述2.2 获取认证用户信息3、认证的几种方式4、注解权限4.1 概述4.2 Secured注解使用方式4.3 jsr250Enabled4.4 prePostEnabled 规范(重要)5、自定义…

【数据结构初阶】二叉树OJ题

⭐博客主页:️CS semi主页 ⭐欢迎关注:点赞收藏留言 ⭐系列专栏:数据结构初阶 ⭐代码仓库:Data Structure 家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注&#xff…

Flume笔记

Flume 概念 高可用、高可靠,分布式海量日志采集、聚合和传输的系统。 主要作用:实时读取服务器本地磁盘的数据,将数据写入到HDFS 组成 Agent,JVM进程,以事件的形式将数据从源头送到目的地 Agent分为Source、Chann…

李宏毅2021春季机器学习课程视频笔记5-模型训练不起来问题(当梯度很小的时候问题)

求解最小Loss的失败,不能得到最优的值,找不到Loss足够小的值。 1.Loss关于参数的梯度为0,不能继续更新参数。(local minima 或者 saddle point)如何知道走到了哪个点? 利用泰勒展开: Critical P…

免费ChatGPT接入-国内怎么玩chatGPT

免费ChatGPT中文版 OpenAI 的 GPT 模型目前并不提供中文版的免费使用,但是有许多机器学习平台和第三方服务提供商也提供了基于 GPT 技术的中文版模型和 API。下面是一些常见的免费中文版 ChatGPT: Hugging Face:Hugging Face 是一个开源社区…

Mysql主备一致性保证

大家知道 bin log 既可以用来归档,又可以用来做主备同步。有人可能会问,为什么备库执行了 bin log 就可以跟主库保持一致了呢?bin log的内容是什么样的呢?今天我们就来聊聊它。 在最开始,Mysql 是以容易学习和方便的高…

JDK1.8下载与安装完整教程

目录 一、获取安装资源 1、百度网盘共享 2、官方网站下载(百度网盘文件下载下来有问题情况下) 2.1、搜索jdk官方网站 2.2、进到官网下拉找到Java8,选择Windows 2.3、下载安装程序(下载要登录,没有账号就注册就行) 二、正式安装 1、先在D盘(不在C…

【模型复现】Network in Network,将1*1卷积引入网络设计,运用全局平均池化替代全连接层。模块化设计网络

《Network In Network》是一篇比较老的文章了(2014年ICLR的一篇paper),是当时比较厉害的一篇论文,同时在现在看来也是一篇非常经典并且影响深远的论文,后续很多创新都有这篇文章的影子。[1312.4400] Network In Networ…

蓝桥杯刷题冲刺 | 倒计时1天

作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾蓝桥杯加油,大家一定可以🐾 文章目录我是菜菜,最近容易我犯的错误总结 一些tips 各位蓝桥杯加油加油 当输入输出数据不超过 1e6 时,scanf printf 和…

elasticsearch基础6——head插件安装和web页面查询操作使用、ik分词器

文章目录一、基本了解1.1 插件分类1.2 插件管理命令二、分析插件2.1 es中的分析插件2.1.1 官方核心分析插件2.1.2 社区提供分析插件2.2 API扩展插件三、Head 插件3.1 安装3.2 web页面使用3.2.1 概览页3.2.1.1 unassigned问题解决3.2.2 索引页3.2.3 数据浏览页3.2.4 基本查询页3…

微服务+springcloud+springcloud alibaba学习笔记(1/9)

1.微服务简介 什么是微服务呢? 就是将一个大的应用,拆分成多个小的模块,每个模块都有自己的功能和职责,每个模块可以 进行交互,这就是微服务 简而言之,微服务架构的风格,就是将单一程序开发成…

项目管理案例分析有哪些?

项目管控中遇到的问题有哪些?这些问题是如何解决的? 在项目管理领域,案例分析是一种常见的方法来学习和理解项目管理实践,下面就来介绍几个成功案例,希望能给大家带来一些参考。 1、第六空间:快速响应个性…

1669_MIT 6.828 xv6代码的获取以及编译启动

全部学习汇总: GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 6.828的学习的资料从开始基本信息的讲解,逐步往unix的一个特殊版本xv6过度了。这样,先得熟悉一下这个OS的基本代码以及环境。 在课程中其实…

最短路径算法及Python实现

最短路径问题 在图论中,最短路径问题是指在一个有向或无向的加权图中找到从一个起点到一个终点的最短路径。这个问题是计算机科学中的一个经典问题,也是许多实际问题的基础,例如路线规划、通信网络设计和交通流量优化等。在这个问题中&#…