前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring 应用之观察者设计模式

Spring 应用之观察者设计模式

作者头像
happyJared
发布2019-10-14 13:31:17
9350
发布2019-10-14 13:31:17
举报
文章被收录于专栏:happyJaredhappyJared

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

Spring 事件驱动模型就是观察者模式中很经典的一个应用。Spring 事件驱动模型非常有用,在很多场景都可以起到解耦系统代码的作用。比如,我们每次添加商品的时候,都需要重新更新商品索引,这个时候就可以利用观察者模式来解决这个问题。

Spring 事件驱动模型中的三种角色

1. 事件角色

ApplicationEvent (org.springframework.context 包下) 充当事件的角色,这是一个抽象类,它继承了 java.util.EventObject 并实现了 java.io.Serializable 接口。

Spring 中默认存在以下事件,他们都是对 ApplicationContextEvent 的实现(继承自ApplicationContextEvent):

  • ContextStartedEventApplicationContext 启动后触发的事件;
  • ContextStoppedEventApplicationContext 停止后触发的事件;
  • ContextRefreshedEventApplicationContext 初始化或刷新完成后触发的事件;
  • ContextClosedEventApplicationContext 关闭后触发的事件。

ApplicationEvent-Subclass

2. 事件监听者角色

ApplicationListener 充当了事件监听者的角色,它是一个接口,里面只定义了一个 onApplicationEvent() 方法来处理 ApplicationEventApplicationListener 接口类的源码如下,所以在 Spring 中只要实现实现 onApplicationEvent() 方法即可完成监听事件:

代码语言:javascript
复制
package org.springframework.context;
import java.util.EventListener;
@FunctionalInterface
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
    void onApplicationEvent(E var1);
}

3. 事件发布者角色

ApplicationEventPublisher 充当了事件的发布者,它也是一个接口。

代码语言:javascript
复制
@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. 使用事件发布者发布消息: 可以通过 ApplicationEventPublisherpublishEvent() 方法发布消息。

Example:

代码语言:javascript
复制
// 定义事件,继承自 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("hello"),控制台就会打印出:接收到的信息是:hello

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.10.12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring 事件驱动模型中的三种角色
    • 1. 事件角色
      • 2. 事件监听者角色
        • 3. 事件发布者角色
        • Spring 的事件流程总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档