spring#事件发布订阅

Posted luohaonan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring#事件发布订阅相关的知识,希望对你有一定的参考价值。

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

我们主动的发布一些事情,然后让一下代码监听事情的发生,然后处理事情,如果有必要可以为事件添加一些属性。

 

 

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);
    }

}
View Code

自定义事件处理器:

技术图片
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")));
        // 这里我读取数据库中的权限信息,加载到内存中去,或者干一些其他相关的事情
    }
}
View Code

事件发布代码:

技术图片
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";
    }
}
View Code

 

以上是关于spring#事件发布订阅的主要内容,如果未能解决你的问题,请参考以下文章

Spring中的观察者模式(发布订阅模式)(基于SpringBoot实现)

Spring Cloud Config Client原理讲解

腾讯T4大牛传授技巧Spring框架中的事件订阅发布

如何让自定义视图观察包含片段的生命周期事件而不是活动?

订阅者的Spring pubsub过滤消息

观察者模式与事件委托