Spring的Event事件模式,对Java原生的扩展,一个事件包括 事件源,事件,事件监听者,ApplicationEvent中包含一个source属性,这个是事件源吗?使用的时候是怎么用的?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Spring框架中,Event
事件模式是对Java原生事件处理机制的一种扩展,主要用于实现应用内部的解耦通信。这一模式主要包含三个核心元素:事件源(Event Source)、事件(Event)和事件监听者(EventListener)。下面我将结合Spring的ApplicationEvent
来解释这些概念以及如何使用。
事件源是触发事件的对象。在Spring中,任何对象都可以成为事件源。当这个对象发生某种特定情况时,它会发布一个事件到Spring应用上下文中,通知其他感兴趣的组件(即事件监听者)。
在Spring中,所有事件都必须继承自ApplicationEvent
类。这个基类提供了一个构造函数,用于接收事件源对象作为参数,并通过其getSource()
方法暴露出来。因此,ApplicationEvent
中的source
属性确实表示事件源,它是触发事件的那个对象的引用。
事件监听者是实现了ApplicationListener
接口的类,该接口定义了一个方法onApplicationEvent(ApplicationEvent event)
,用于处理接收到的事件。监听者通过订阅感兴趣的事件类型来注册自己,一旦相应的事件被发布,Spring容器就会调用这些监听者的onApplicationEvent
方法。
ApplicationEvent
的自定义事件类。import org.springframework.context.ApplicationEvent;
public class CustomEvent extends ApplicationEvent {
private String message;
public CustomEvent(Object source, String message) {
super(source);
this.message = message;
}
public String getMessage() {
return message;
}
}
ApplicationContext
发布事件。import org.springframework.context.ApplicationContext;
import org.springframework.context.event.EventPublisher;
public class EventPublisherService {
private final ApplicationContext applicationContext;
public EventPublisherService(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
public void publish() {
String msg = "Hello World!";
CustomEvent customEvent = new CustomEvent(this, msg);
applicationContext.publishEvent(customEvent);
}
}
ApplicationListener
接口并处理事件。import org.springframework.context.ApplicationListener;
public class CustomEventListener implements ApplicationListener<CustomEvent> {
@Override
public void onApplicationEvent(CustomEvent event) {
System.out.println("Received custom event - Message: " + event.getMessage());
}
}
配置监听器:确保你的监听器被Spring管理,可以通过@Component注解自动扫描或者在XML配置文件中手动声明。
测试:现在,当你调用EventPublisherService
的publish
方法时,所有注册了对CustomEvent
感兴趣的监听器都会收到事件并执行它们的onApplicationEvent
方法。
这样,通过Spring的事件模型,你可以实现组件之间的松耦合通信,使得系统更加灵活和可维护。