Spring Boot 2.x实战12 - Spring 5.x基础10 - Bean之间的事件通讯

5 Bean之间的事件通讯

如果Bean之间需要通讯,比如说Bean A完成了处理后需要告知B,通知B继续处理。A我们叫做Publisher,B叫做Listener

PublisherListener的传递的事件数据通过继承ApplicationEvent来实现。

Publisher的实现方式有:

  • 通过ApplicationEventPublisherAware注入ApplicationEventPublisher发布事件,前面已演示;
  • 直接注入ApplicationEventPublisher发布事件;
  • 直接注入ApplicationContext发布事件。

Listener的实现方式有:

  • 实现ApplicationListener接口;
  • 注解@EventListener的方法接受;

事件数据:

public class MessageEvent extends ApplicationEvent {

    private String message;

    public MessageEvent(String message) {
        super(message);
       this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

发布者:

@Component
public class EventPublishService {
    ApplicationEventPublisher publisher;

    public EventPublishService(ApplicationEventPublisher publisher) {
        this.publisher = publisher;
    }

    public void publish(){
        System.out.println("EventPublishService正在处理,处理完成后通知EvenListenerService继续处理");
        publisher.publishEvent(new MessageEvent("EventPublishService处理完了"));
    }
}

监听者:

@Component
public class EventListenerService implements ApplicationListener<MessageEvent> { //1

    @Override
    public void onApplicationEvent(MessageEvent event) { //1
        System.out.println("onApplicationEvent接受到了:" + event.getMessage());
    }

}

EventListenerService实现ApplicationListener<MessageEvent>接口,泛型MessageEvent缩小监听事件的范围,通过重载onApplicationEvent方法来监听事件。

监听者还可以注解了@EventListener方法来监听事件:

@Component
public class EventListenerService2 {

    @EventListener
    public void eventListener(MessageEvent event){
        System.out.println("@EventListener接受到了:" + event.getMessage());
    }

}

当然我们推荐使用@EventListener注解方式,耦合度更低。

我们除了能监听自定义发布的事件,我们同样也可以监听系统发布的事件,如:

@EventListener
public void contextRefreshedEventListener(ContextRefreshedEvent event){
    System.out.println("@EventListener接受到了:" + event.getSource());
}

主要的系统事件有:

  • ContextRefreshedEvent:当ApplicationContext被初始化或刷新时发布该事件;
  • ContextStartedEvent:当ApplicationContext开始时发布该事件;
  • ContextStoppedEvent:当ApplicationContext停止时发布该事件;
  • ContextClosedEvent:当ApplicationContext关闭时发布该事件;

新书推荐:

我的新书《从企业级开发到云原生微服务:Spring Boot 实战》已出版,内容涵盖了丰富Spring Boot开发的相关知识
购买地址:https://item.jd.com/12760084.html

在这里插入图片描述

主要包含目录有:

第一章 初识Spring Boot(快速领略Spring Boot的美丽)
第二章 开发必备工具(对常用开发工具进行介绍:包含IntelliJ IDEA、Gradle、Lombok、Docker等)
第三章 函数式编程
第四章 Spring 5.x基础(以Spring 5.2.x为基础)
第五章 深入Spring Boot(以Spring Boot 2.2.x为基础)
第六章 Spring Web MVC
第七章 数据访问(包含Spring Data JPA、Spring Data Elasticsearch和数据缓存)
第八章 安全控制(包含Spring Security和OAuth2)
第九章 响应式编程(包含Project Reactor、Spring WebFlux、Reactive NoSQL、R2DBC、Reactive Spring Security)
第十章 事件驱动(包含JMS、RabbitMQ、Kafka、Websocket、RSocket)
第11章 系统集成和屁股里(包含Spring Integration和Spring Batch)
第12章 Spring Cloud与微服务
第13章 Kubernetes与微服务(包含Kubernetes、Helm、Jenkins、Istio)
多谢大家支持。

发布了116 篇原创文章 · 获赞 10 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/wiselyman/article/details/105734330