(三)观察者模式

参考:


什么是观察者模式:

观察者模式是一种对象行为型模式。它表示的是一种对象与对象之间具有依赖关系,当一个对象发生改变的时候,与这个对象有依赖关系的对象会做相应的反应。

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));
    }
}

当调用 DemoPublisherpublish()方法的时候,比如 demoPublisher.publish("你好"),控制台就会打印出:接收到的信息是:你好 。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值