博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ApplicationEventPublisher实现发布订阅功能
阅读量:4098 次
发布时间:2019-05-25

本文共 1904 字,大约阅读时间需要 6 分钟。

文章目录


前言

Spring中提供一种类似发布订阅功能的实现方式,我们可以利用该特性,在需要通知其他组件的地方发布消息,订阅方收到消息后,就能 做相应逻辑处理。

下面是个简单demo演示

一、项目结构

在这里插入图片描述

一:MyController

简单的路口

@RestController@RequestMapping(value = "/demo")public class MyController {
@Autowired private MyRegister myRegister; @RequestMapping(value = "",method = RequestMethod.GET) public void test(){
myRegister.register(); } @RequestMapping(value = "/test2",method = RequestMethod.GET) public void test2(){
myRegister.registerEvent(); }}

二:UserDto

简单实体类

@Datapublic class UserDto {
private String name; private int age;}

三:MyApplicationEvent

spring的源码中通过对ApplicationEventPublisher可以知道,支持两种发布格式,这是其中一种

需要继承这个类:org.springframework.context.ApplicationEvent;

public class MyApplicationEvent extends ApplicationEvent {
public MyApplicationEvent(Object source) {
super(source); }}

四:MyListener

订阅者组件

@EventListener支持SPEL表达式,如果是true,订阅到消息才执行
如果没有配置condition属性,默认接收到订阅消息就执行

@Componentpublic class MyListener {
@EventListener(condition = "#userDto.name != null") public void handler(UserDto userDto) {
System.out.println(userDto); } @EventListener public void handler(MyApplicationEvent myApplicationEvent) {
System.out.println(myApplicationEvent.getSource().toString()); }}

五:MyRegister

发布者

这里可以看到ApplicationEventPublisher 支持两种方式的发布
第一种是直接发布Object对象
第二种是经过封装的ApplicationEvent 的对象,其实这个对象里面只有两个属性,一个时间戳,一个Object对象

@Servicepublic class MyRegister {
@Autowired private ApplicationEventPublisher publisher; public void register() {
UserDto userDto = new UserDto(); userDto.setAge(18); userDto.setName("张三"); publisher.publishEvent(userDto); } public void registerEvent() {
ApplicationEvent event = new MyApplicationEvent("哈哈哈哈哈哈"); publisher.publishEvent(event); }}

六:启动测试

测试发布订阅第一种方式,测试成功

在这里插入图片描述

在这里插入图片描述

测试发布订阅第二种方式,测试成功

在这里插入图片描述

在这里插入图片描述

转载地址:http://wurii.baihongyu.com/

你可能感兴趣的文章
B 站爆红的数学视频,竟是用这个 Python 开源项目做的!
查看>>
安利 10 个让你爽到爆的 IDEA 必备插件!
查看>>
自学编程的八大误区!克服它!
查看>>
GitHub 上的一个开源项目,可快速生成一款属于自己的手写字体!
查看>>
早知道这些免费 API,我就可以不用到处爬数据了!
查看>>
Java各种集合类的合并(数组、List、Set、Map)
查看>>
JS中各种数组遍历方式的性能对比
查看>>
Mysql复制表以及复制数据库
查看>>
进程管理(一)
查看>>
linux 内核—进程的地址空间(1)
查看>>
存储器管理(二)
查看>>
开局一张图,学一学项目管理神器Maven!
查看>>
Android中的Binder(二)
查看>>
Framework之View的工作原理(一)
查看>>
Web应用架构
查看>>
设计模式之策略模式
查看>>
深究Java中的RMI底层原理
查看>>
用idea创建一个maven web项目
查看>>
Kafka
查看>>
9.1 为我们的角色划分权限
查看>>