spring 使用事件驱动

概述:
一、三要素
1、监听器:Listener
2、事件源:event
3、事件的发布者:Publisher
二、实现方式
1、事件源:Event设计

// 重点是继承 ApplicationEvent
public class MyEvent extends ApplicationEvent {
    private static final long serialVersionUID = -6921924726678224331L;
    /**
     *  这里是一些事件的私有属性,比如name或者什么其他对象
     */
    private String name;

    /**
     * Create a new ApplicationEvent.
     *
     * @param source the object on which the event initially occurred (never {@code null})
     */
    public MyEvent(Object source) {
        super(source);
        if(source instanceof String){
            name = source.toString();
        }
    }

    public String getName() {
        return name;
    }
}

2、监听器设计

@Component
public class MyListener implements ApplicationListener<MyEvent> {
    /**
     * Handle an application event.
     *
     * @param event the event to respond to
     */
    @Override
    public void onApplicationEvent(MyEvent event) {
    	// 用于处理事件,也就是事件触发后的执行逻辑
        System.out.println("MyListener处理事件,获取事件属性数据:"+event.getName());
    }
}

3、事件的发布者设计

// 继承至SimpleApplicationEventMulticaster,可以用于发布事件
public class MyPublisher extends SimpleApplicationEventMulticaster{
	
	// 发布事件
    public void publishEvent(@NotNull ApplicationEvent event) {
       super.multicastEvent(event);
    }
}

4、配置类设计

@Configuration
public class MyListenerConfig {
    @Autowired
    private MyListener myListener;
    
    @Bean
    public MyPublisher myPublisher (){
        MyPublisher  eventPublisher = new MyPublisher();  
        eventPublisher.addApplicationListener(myListener);
         // 设置错误处理器,处理事件产生的异常信息
        eventPublisher.setErrorHandler(new WebEventErrorHandler());
        // 不能设置线程池,否则事件不会立即执行
        return eventPublisher;
    }
	 private static class WebEventErrorHandler implements ErrorHandler {
	        @Override
	        public void handleError(Throwable t) {
	            ReflectionUtils.rethrowRuntimeException(t);
	        }
	    }
}

三、如何使用

@Service
public class MyEventServiceImpl {
    @Autowired
    private MyPublisher myPublisher;
    // 调用此方法,可以自动执行监听器中的onApplicationEvent方法逻辑
    public void eventTest() {
        MyEvent myEvent = new MyEvent("张三");
        myPublisher.publishEvent(myEvent);
    }
}

热门文章

暂无图片
编程学习 ·

7 模块与包

7 模块与包 Python中的模块和包一个py文件就是一个模块,py文件的文件名就是模块名。在 Python 里为了对模块分类管理,就需要划分不同的文件夹。多个有联系的模块可以将其放到同一个文件夹下,为了称呼方便,一般把 Python 里的一个代码文件夹称为一个包。7.1 导入模块导入模块…
暂无图片
编程学习 ·

javaScript之ES6

ES6新增的内容 新增的let和constlet num1 = 10console.log(num1) //10const num2 = 10console.log(num2) //10let const声明变量和 var声明变量的区别:用let 和const 声明的变量不会进行预解析,只能先声明后使用 用let 和const 不能重复声明同一个变量 用let 和const声明 变…
暂无图片
编程学习 ·

OpenCV的初步解读

OpenCV的初步解读图像读取:cv2.imread(path,flag)`` flag:如何读取图片:cv2.IMREAD_COLOR:读取彩色图像。图像的透明度会被忽略(默认参数)。 cv2.IMREAD_GRAYSCALE:读取灰度图像。 flag=-1, 8位深度,原通道 flag=0, 8位深度 1通道 flag=1, 8位…
暂无图片
编程学习 ·

python从入门到放弃篇8(while True的使用,列表,if嵌套)实现选举小程序

今天,我又开始了新的征程,开始学习Java,但是老本不能忘,所以,我打算先把python的全套入门到放弃做完,再开始Java的新篇章,我刚刚装了Java的Esclipe编辑器全英文,还不太适应,过一段时间,慢慢熟悉,应该就会好起来了。路一步步走,饭一口口吃。 while循环,我是很喜欢的…
暂无图片
编程学习 ·

2 css

css的三大特性 css有三个非常重要的三个特性;层叠性 继承性 优先级 层叠性 相同选择器给设置相同的样式,此时一个样式就会覆盖(层叠)另一个冲突的样式,层叠性 主要解决样式冲突的问题 原则 样式冲突,遵循原则上就近原则,那个样式离结构近,就执行那个样式 样式不冲突,不…
暂无图片
编程学习 ·

Embind用于将C ++和JavaScript交互

官方文档EmbindEmbind is used to bind C++ functions and classes to JavaScript, so that the compiled code can be used in a natural way by “normal” JavaScript. Embind also supports calling JavaScript classes from C++.Embind has support for binding most C++ …
暂无图片
编程学习 ·

IIs7上传文件大小光设置web.config还不行

打开你系统盘(我是C盘),找到 C:\Windows\System32\inetsrv\config\schema目录,该目录下有一个IIS_schema.xml修改这个:<attribute name="maxAllowedContentLength" type="uint" defaultValue="30000000" />"单位byte
暂无图片
编程学习 ·

ssm

目录User.javaUserController.javaUserDao.javaUserService.javaIUserService.javaUserMapper.xmlapplicationContext.xmldb.propertiesspring-mvc.xmlapplicationContext.xmlweb.xmlfailure.jspIndex.jspok.jsp pring 1.控制反转-》控制权的转移 2.依赖注入 DI 3.面向切面 aop…
暂无图片
编程学习 ·

tensorflow 中tf.strided_slice和tf.slice的区别

函数:tf.slice(inputs, begin, size, name) 作用:从列表、数组、张量等对象中抽取一部分数据begin和size是两个多维列表,他们共同决定了要抽取的数据的开始和结束位置 begin表示从inputs的哪几个维度上的哪个元素开始抽取 size表示在inputs的各个维度上抽取的元素个数import…
暂无图片
编程学习 ·

Spring-boot 使用undertow代替tomcat

Undertow是Red Hat公司的开源产品, 是一款灵活的高性能Web服务器,它完全采用Java语言开发,可以直接嵌入到Java项目中使用,支持阻塞IO和非阻塞IO。由于Undertow采用Java语言开发。 Undertow在高并发业务场景中,性能优于Tomcat,对于并发要求不高的情况下,二者差别不大。 Un…
暂无图片
编程学习 ·

百度云在线播放视频设置倍速播放

百度云在线播放器为html5播放器,所以直接修改其属性可达到加速效果:本人使用的是Safari浏览器,有效。右击网页打开“审查元素”(有的叫做“检查”)。2. 选择控制台3.粘贴命令 //设置默认倍速 为2倍 document.querySelector(video).defaultPlaybackRate = 2.0; document.qu…
暂无图片
编程学习 ·

微服务的全局异常处理器

如果是dubbo服务 直接在对外暴露服务的哪个模块添加该类即可 如果是springboot微服务 我们可以把他配置到网关里 并且在启动类配置如下目的是为了让服务知道该配置 否则不生效 ApiReturnObject是一个统一返回值类型 可以根据自己喜好进行定义 这里就不贴代码了package com.s…
暂无图片
编程学习 ·

注释,变量

1.注释 注释就是对代码的解释(notepad++里ctrl+q, pycharm里ctrl+/) 1.1 注释的分类:(1)单行注释 #(2)多行注释 ‘’’ 或 ‘’’’’’ 注意嵌套! 1.2 注释的功能:注释有排错的功能,包裹一部分,看是否报错,循环找出错误. 2 . 变量 变量就是可以改变的量,实际指代的是内…
暂无图片
编程学习 ·

mysql学习总结

连接数据库语句:mysql -h 服务器主机地址 -u 用户名 -p用户密码 基本的数据库操作命令: update user set password=password(‘123456’)where user=‘root’; 修改密码 flush privileges; 刷新数据库 show databases; 显示所有数据库 use dbname;打开某个数据库 show table…
暂无图片
编程学习 ·

VMware上安装达梦数据库8.0

VMware上安装达梦数据库8.0 VMware上安装达梦数据库8.0 本文指导达梦数据库8.0版本的安装,安装环境为中标麒麟7操作系统 第一步: 操作系统界面右键进入终端控制台,如下图所示:第二步: 规划dm8安装路径:首先,查看磁盘信息是否满足,如下图所示;2. 新建dm8安装目录,如下…
暂无图片
编程学习 ·

Java四种访问权限从大大小排列

public:可以被所有其他类所访问 protected:自身、子类及同一个包中类可以访问 default:同一包中的类可以访问,声明时没有加修饰符,认为是friendly private:只能被自己访问和修改。 public: 具有最大的访问权限,可以访问任何一个在classpath下的类、接口、异常等。它往往…
暂无图片
编程学习 ·

mysql怎么连接navicat

可能出现下面的问题远程连接发现没有什么问题 在命令行 mysql可以正常使用执行三条指令就可以解决
暂无图片
编程学习 ·

mongodb编译安装

CentOS7 编译安装 Mongodb (实测 笔记 Centos 7.0 + Mongodb 2.6.6) 环境:系统硬件:vmware vsphere (CPU:2*4核,内存2G,双网卡)系统版本:CentOS-7.0-1406-x86_64-DVD.iso安装步骤:1.准备1.1 显示系统版本 [root@centos ~]# cat /etc/redhat-release CentOS Linux releas…