1. 如果在应用中发生了某些事件,事件会被拦截和处理就好了,这样就有了很大的灵活性,至少代码不会紧密的耦合在一起,

代码的解耦就是业务的解耦,业务A的代码不用手动的调用业务B的代码,业务B只需要监听相关事件,根据事件处理业务就可以了。

2. 几个类:

  • 事件类:ApplicationEvent 继承 java.util.EventObject, 我们需要继承ApplicationEvent,必要时候为事件添加一些属性;
  • 事件发布类:ApplicationContext 继承了org.springframework.context.ApplicationEventPublisher,我们需要通过ApplicationContext.publisEvent(event)发布事件;
  • 事件处理类:ApplicationListener 继承了java.util.EventListener,我们需要实现ApplicationListener接口,并覆写处理事件的方法,完成事件处理逻辑。

3. 一个demo:

自定义事件:

import org.springframework.context.ApplicationEvent;

public class PermissionNeedReloadEvent extends ApplicationEvent {

    public PermissionNeedReloadEvent(Object source) {
super(source);
} }

自定义事件处理器:

import com.haonan.event.events.PermissionNeedReloadEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; @Component // 通过注解把当前的事件处理器注入到spring容器中去
public class PermissionNeedReloadEventHandler implements ApplicationListener<PermissionNeedReloadEvent> {
@Override
public void onApplicationEvent(PermissionNeedReloadEvent permissionNeedReloadEvent) {
System.out.println(Thread.currentThread().getName() + "------------------出事啦 @" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
// 这里我读取数据库中的权限信息,加载到内存中去,或者干一些其他相关的事情
}
}

事件发布代码:

import com.haonan.event.events.PermissionNeedReloadEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class TestController { @Autowired
private ApplicationContext app; @GetMapping("/hello")
public String addRole() {
// 这里系统中添加一些角色信息
// 逻辑代码 // 当系统添加了角色信息,需要产生一个权限需要被重新加载的事件
app.publishEvent(new PermissionNeedReloadEvent(this));
return "success";
}
}

spring#事件发布订阅的更多相关文章

  1. 模块(类)之间解耦利器:EventPublishSubscribeUtils 事件发布订阅工具类

    如果熟悉C#语言的小伙伴们一般都会知道委托.事件的好处,只需在某个类中提前定义好公开的委托或事件(委托的特殊表现形式)变量,然后在其它类中就可以很随意的订阅该委托或事件,当委托或事件被触发执行时,会自 ...

  2. 基于Spring的发布订阅模式 EventListener

    基于Spring的发布订阅模式 在我们使用spring开发应用时,经常会碰到要去解耦合一些依赖调用,比如我们在做代码的发布流程中,需要去通知相关的测试,开发人员关注发布中的错误信息.而且通知这个操作又 ...

  3. 使用MediatR重构单体应用中的事件发布/订阅

    标题:使用MediatR重构单体应用中的事件发布/订阅 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/10640280.html 源代码:https ...

  4. ASP.NET Core中实现单体程序的事件发布/订阅

    标题:ASP.NET Core中实现单体程序的事件发布/订阅 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/10468058.html 项目源代码: ...

  5. guava的事件发布订阅功能

    事件的重要性,不用说很重要,在很多时候我们做完一个操作的时候,需要告知另外一个对象让他执行相应操作,比如当用户注册成功的时候,需要抛出一个注册成功的事件,那么有监听器捕获到这个事件,完成后续用户信息初 ...

  6. Blazor+Dapr+K8s微服务之事件发布订阅

    我们要实现的是:在blazorweb服务中发布一个事件,并传递事件参数,然后在serviceapi1服务中订阅该事件,接收到blazorweb服务中发布的事件和参数. 1         在blazo ...

  7. 从spring源码汲取营养:模仿spring事件发布机制,解耦业务代码

    前言 最近在项目中做了一项优化,对业务代码进行解耦.我们部门做的是警用系统,通俗的说,可理解为110报警.一条警情,会先后经过接警员.处警调度员.一线警员,警情是需要记录每一步的日志,是要可追溯的,比 ...

  8. Spring事件发布与监听机制

    我是陈皮,一个在互联网 Coding 的 ITer,微信搜索「陈皮的JavaLib」第一时间阅读最新文章,回复[资料],即可获得我精心整理的技术资料,电子书籍,一线大厂面试资料和优秀简历模板. 目录 ...

  9. javascript 自定义事件 发布-订阅 模式 Event

    * javascript自定义事件 var myEvent = document.createEvent("Event"); myEvent.initEvent("myE ...

随机推荐

  1. VUE学习笔记二

    package.json不可以写注释!!!!!!!!!!初始化:npm init -y 有时候使用 npm i node-sass -D 装不上,这时候,就必须使用  cnpm i node-sass ...

  2. IDEA中使用GsonFormat

    版本:IDEA Community 2019.2.2 说明:GsonFormat是一个可以直接将Json对象转化为Java类的插件 流程:安装GsonFormat插件=>新建一个空类Book=& ...

  3. Pytorch本人疑问(2)model.train()和model.eval()的区别

    我们在训练时如果使用了BN层和Dropout层,我们需要对model进行标识: model.train():在训练时使用BN层和Dropout层,对模型进行更改. model.eval():在评价时将 ...

  4. 数据库转换Mysql-Oracle之建表语句

    Mysql建库语句(导出的): DROP TABLE IF EXISTS `tablename`; CREATE TABLE `tablename` ( `C_DI_CDE` varchar(40) ...

  5. sparkRDD:第3节 RDD常用的算子操作

    4.      RDD编程API 4.1 RDD的算子分类 Transformation(转换):根据数据集创建一个新的数据集,计算后返回一个新RDD:例如:一个rdd进行map操作后生了一个新的rd ...

  6. WCF服务调用方式

    WCF服务调用通过两种常用的方式:一种是借助代码生成工具SvcUtil.exe或者添加服务引用的方式,一种是通过ChannelFactory直接创建服务代理对象进行服务调用.

  7. kubernetes 使用flannel网络模式 错误分析

    今天按照网上和书上的要求,将目前的kubernetes网络换成flannel.其实配置起来还是很简单的,但是一旦出现了问题,将很难解决. 配置方法我这边不给出了.因为网上这样的教程一大把,在说下去也无 ...

  8. linux----Nginx能做什么

    linux----Nginx能做什么 标签: nginx负载均衡代理服务器 2017-04-01 14:15 588人阅读 评论(0) 收藏 举报 .embody{ padding:10px 10px ...

  9. Windows 网络显示监视器软件_spacedesk

    将各种设备拓展为 Windows 第二屏幕 官方网站 https://spacedesk.net/ 使用教程参阅: https://blog.csdn.net/sinat_21902709/artic ...

  10. Dubbo+zookeeper部署到tomcat上注意事项,遇到的问题,闪退,运行报错等

    需要下载工具zookeeper-3.4.14.tar.gz,dubbo-2.5.x.zip,apache-tomcat-8.5.47-windows-x64.zip这些官网都可以先下载到 1.最新的z ...