参考:
什么是观察者模式:
观察者模式是一种对象行为型模式。它表示的是一种对象与对象之间具有依赖关系,当一个对象发生改变的时候,与这个对象有依赖关系的对象会做相应的反应。
Spring的事件驱动模型就是观察者模式很经典的一个应用。Spring 事件驱动模型非常有用,优点是 可以用来解耦我们的代码。
Spring 事件驱动模型中的三种角色:
事件角色
ApplicationEvent (org.springframework.context
包下)充当事件的角色,这是一个抽象类
,它继承了java.util.EventObject并实现了 java.io.Serializable接口。
Spring 中默认提供了以下事件供我们使用,他们都继承自ApplicationContextEvent:
- ContextStartedEvent:ApplicationContext 启动后触发的事件;
- ContextStoppedEvent:ApplicationContext 停止后触发的事件;
- ContextRefreshedEvent:ApplicationContext 初始化或刷新完成后触发的事件;
- ContextClosedEvent:ApplicationContext 关闭后触发的事件。
【注】:提供了默认的事件类,也就相应的提供了监听类。
一般我们在使用事件驱动模型时,会继承ApplicationEvent
来自定义事件类。
事件监听者角色Listener
ApplicationListener
充当了事件监听者角色,它是一个接口,里面只定义了一个 onApplicationEvent()
方法来处理ApplicationEvent
。
查看ApplicationListener
的接口源码,发现它是一个函数式接口,我们只需要实现ApplicationEvent
接口中的方法onApplicationEvent()
方法即可完成监听事件
事件发布者角色
ApplicationEventPublisher
充当了事件的发布者,它也是一个函数式接口。
@FunctionalInterface
public interface ApplicationEventPublisher {
default void publishEvent(ApplicationEvent event) {
this.publishEvent((Object)event);
}
void publishEvent(Object var1);
}
ApplicationEventPublisher
接口的publishEvent()
这个方法在 AbstractApplicationContext
类中被实现,阅读这个方法的实现,你会发现实际上事件真正是通过 ApplicationEventMulticaster
来广播出去的。具体内容过多,就不在这里分析了。
Spring 的事件流程总结:
- 1 定义一个事件: 实现一个继承自 ApplicationEvent,并且写相应的构造函数;
- 2 定义一个事件监听者:实现 ApplicationListener 接口,重写 onApplicationEvent() 方法;
- 3 使用事件发布者发布消息: 可以通过 ApplicationEventPublisher 的 publishEvent() 方法发布消息。
Example:
// 定义一个事件,继承自ApplicationEvent并且写相应的构造函数
public class DemoEvent extends ApplicationEvent{
private static final long serialVersionUID = 1L;
private String message;
public DemoEvent(Object source,String message){
super(source);
this.message = message;
}
public String getMessage() {
return message;
}
// 定义一个事件监听者,实现ApplicationListener接口,重写 onApplicationEvent() 方法;
@Component
public class DemoListener implements ApplicationListener<DemoEvent>{
//使用onApplicationEvent接收消息
@Override
public void onApplicationEvent(DemoEvent event) {
String msg = event.getMessage();
System.out.println("接收到的信息是:"+msg);
}
}
// 发布事件,可以通过ApplicationEventPublisher 的 publishEvent() 方法发布消息。
@Component
public class DemoPublisher {
@Autowired
ApplicationContext applicationContext;
public void publish(String message){
//发布事件
applicationContext.publishEvent(new DemoEvent(this, message));
}
}
当调用 DemoPublisher
的 publish()
方法的时候,比如 demoPublisher.publish("你好")
,控制台就会打印出:接收到的信息是:你好 。