EventBus与Spring Event区别详解
EventBus 事件机制
EventBus 是一个主要的事件总线框架。它是基于发布订阅(Publish/Subscribe)模式进行事件通信的框架。
EventBus 核心概念
- Events: 事件定义,包括事件的数据结构。
- Subscriber: 订阅者,负责订阅与处理事件。
- Publishers: 发布者,负责发布事件。
- Event Bus: 事件总线,用于让订阅者和发布者之间进行交互。
EventBus 事件发布流程
- 定义事件对象,并构建事件发布者。
EventBus eventBus = new EventBus();
eventBus.register(new EventListener());
- 构建事件发布者,并发布事件。
eventBus.post(new TestEvent());
- 构建事件订阅者,并接受并处理事件。
@Subscribe
public void onEvent(TestEvent event){
// todo something
}
EventBus 优点
- 简单易用。
- 易于扩展,可以使用注解或接口等形式定义订阅者和事件。
- 使用方便,可以直接发出事件对象。
EventBus 缺点
- 不适合大型系统。
- 由于发布-订阅模式,可能会存在事件传递的误解和冻结问题。
Spring Event 事件机制
Spring Event 是Spring Framework中的一种事件机制。该机制基于观察者模式(Observer Pattern)实现事件通信。
Spring Event 核心概念
- ApplicationEvent:事件定义,包括事件的数据结构。
- ApplicationListener:事件监听器,负责订阅与处理事件。
- ApplicationEventPublisher:事件发布者,负责发布事件。
- ApplicationContext:Spring容器,用于让事件监听器和事件发布者之间进行交互。
Spring Event 事件发布流程
- 定义事件对象。
public class TestEvent extends ApplicationEvent{
public TestEvent(Object source){
super(source);
}
}
- 通过ApplicationContext发布事件。
ApplicationContext context = new AnnotationConfigApplicationContext();
TestEvent event = new TestEvent(this);
context.publishEvent(event);
- 实现 ApplicationListener 接口,并接收事件。
public class EventListener implements ApplicationListener<TestEvent>{
@Override
public void onApplicationEvent(TestEvent event){
// todo something
}
}
Spring Event 优点
- 由于基于Spring Framework,能够和Spring容器协同工作。
- 更加灵活,能够对事件的处理方式进行更加自由的控制。
- 高级特性,能够基于条件进行事件监听和处理。
Spring Event 缺点
- 容易出现环路问题,需要着重处理。
EventBus 与 Spring Event 区别
相同点
- 都是一种事件机制,实现事件订阅、发布、监听等功能。
- 都可用于解耦,降低代码复杂度。
不同点
- EventBus 更加简洁易用,需要少量代码即可完成事件订阅和发布。
- Spring Event 更加灵活,并可作为Spring框架中的一部分使用。
- EventBus 基于发布订阅模式,Spring Event 基于观察者模式。
- EventBus 基于给定的类型寻找对应的监听器,可以同时接收多个事件类型。Spring Event 监听器注册和委托到事件的基类上,因此一个监听器实例只能接收一个事件类型。
示例:
EventBus 示例
public class EventBusDemo {
@Test
public void test_eventBus() {
EventBus eventBus = new EventBus("Test");
eventBus.register(new OrderEventListener());
eventBus.post(new OrderEvent("order 1"));
eventBus.post(new OrderEvent("order 2"));
eventBus.post(new PaymentEvent("payment 1"));
}
}
class OrderEvent {
private String message;
public OrderEvent(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
class PaymentEvent {
private String message;
public PaymentEvent(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
class OrderEventListener {
@Subscribe
public void handle(OrderEvent event) {
System.out.println("handle Order: " + event.getMessage());
}
}
class PaymentEventListener {
@Subscribe
public void handle(PaymentEvent event) {
System.out.println("handle Payment: " + event.getMessage());
}
}
Spring Event 示例
public class SpringEventDemo {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext();
context.addApplicationListener(new OrderEventListener());
context.addApplicationListener(new PaymentEventListener());
context.publishEvent(new OrderEvent("order 1"));
context.publishEvent(new OrderEvent("order 2"));
context.publishEvent(new PaymentEvent("payment 1"));
}
}
class OrderEvent extends ApplicationEvent {
private String message;
public OrderEvent(String message) {
super(message);
this.message = message;
}
public String getMessage() {
return message;
}
}
class PaymentEvent extends ApplicationEvent {
private String message;
public PaymentEvent(String message) {
super(message);
this.message = message;
}
public String getMessage() {
return message;
}
}
class OrderEventListener implements ApplicationListener<OrderEvent> {
@Override
public void onApplicationEvent(OrderEvent event) {
System.out.println("handle Order: " + event.getMessage());
}
}
class PaymentEventListener implements ApplicationListener<PaymentEvent> {
@Override
public void onApplicationEvent(PaymentEvent event) {
System.out.println("handle Payment: " + event.getMessage());
}
}
以上是对 EventBus 与 Spring Event 区别的详解,希望对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:EventBus与Spring Event区别详解(EventBus 事件机制,Spring Event事件机制) - Python技术站