ApplicationEventPublisher的简单使用
ApplicationEventPublisher
是 Spring 框架中的一个接口,用于发布应用程序事件。它定义了一个名为 publishEvent
的方法,用于发布事件。
在程序内部一些简单的通信场景,可以优先选择ApplicationEventPublisher来处理,或者项目没有配备MQ中间件的场景……泰裤辣!
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ApplicationEventPublisher;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
// 事件
class MyEvent extends ApplicationEvent {
private String message;
public MyEvent(Object source, String message) {
super(source);
this.message = message;
}
public String getMessage() {
return message;
}
}
// 事件监听者
@Component
class MyEventListener implements ApplicationListener<MyEvent> {
@Override
public void onApplicationEvent(MyEvent event) {
System.out.println("接收到消息:" + event.getMessage());
}
}
// 事件发布者
@Component
class EventPublisher {
private final ApplicationEventPublisher eventPublisher;
public EventPublisher(ApplicationEventPublisher eventPublisher) {
this.eventPublisher = eventPublisher;
}
public void publishEvent(String message) {
eventPublisher.publishEvent(new MyEvent(this, message));
}
}
// 应用程序入口类
@Component
public class Application {
private final EventPublisher eventPublisher;
public Application(EventPublisher eventPublisher) {
this.eventPublisher = eventPublisher;
}
public void run() {
eventPublisher.publishEvent("Hello, World!");
}
public static void main(String[] args) {
org.springframework.context.ApplicationContext context =
org.springframework.boot.SpringApplication.run(Application.class, args);
Application application = context.getBean(Application.class);
application.run();
}
}
MyEvent
这个实现类,即可视为消息的一种映射,如果你发布不同类型的消息,那么可以对MyEvent
的成员变量做相应扩展,并于监听者MyEventListener
处根据不同类型消息做不同行为的处理。
缺点(因此在使用的时候,要根据你的实际业务场景来选择用它,还是用MQ中间件)
有限的可靠性:
ApplicationEventPublisher
是在应用程序内部实现的,因此它依赖于应用程序的运行状态。如果应用程序崩溃或重启,那些未被处理的事件可能会丢失。与消息队列相比,消息队列通常具有持久化和可靠性保证,可以在应用程序故障后保留未处理的消息。性能开销:尽管
ApplicationEventPublisher
是应用程序内部的实现,但它仍然需要遍历所有的事件监听器并调用它们的处理方法。如果事件监听器过多或处理逻辑复杂,可能会导致性能开销。难以追踪和调试:由于事件的传播过程是通过接口和抽象类型进行定义的,它们的调用和处理过程可能比较难以跟踪和调试。相比之下,使用消息队列可以更容易地追踪和监控消息的传递和处理过程。