美文网首页
Spring 事件:Application Event

Spring 事件:Application Event

作者: 活这么大就没饱过 | 来源:发表于2017-03-24 16:30 被阅读1904次

    前言

    想必你一定为两个 Bean 之间基于耗时事件处理的通知和处理顺序而困扰吧,有困扰没事,不要憋在肚子里,早已经有先驱们发现了痛点并设计出了解决方案——Application Event。(了解 Android 的朋友们可以联想一下 EventBus)

    Spring Application Event

    Spring 的事件(Application Event)为 Bean 与 Bean 之间的消息通信提供了支持。当一个 Bean 处理完一个任务之后,希望另一个 Bean 知道并能做相应的处理,这时我们就需要让另一个 Bean 监听当前 Bean 所发送的时间。(观察者模式)
    Spring 的事件需要遵循以下流程:

    1. 自定义事件,集成 ApplicationEvent。
    2. 定义事件监听器,实现 ApplicationListener。
    3. 使用容器发布事件。

    Talk Is Cheap,Show Me Code

    以下代码基于 Spring Boot 实现

    1. 自定义事件

    public class DemoEvent extends ApplicationEvent {
    
      private static final long serialVersionUID = 1L;
      private String msg;
      
      public DemoEvnet(Object source, String msg) {
        super(source);
        this.msg = msg;
      }
      
      public String getMsg() {
        return msg;
      }
      
      public void setMsg(String msg) {
        this.msg = msg;
      }
    }
    

    2. 事件监听者

    @Component
    public class DemoListener implements ApplicationListener<DemoEvent> {
    
      public void onApplicationEvent(DemoEvent event) {
        String msg = event.getMsg();
        System.out.println("接收到了消息:" + msg);
      }
    }
    

    代码解释:

    • 实现 ApplicaionListener 接口,并制定监听的时间类型。
    • 使用 onApplicationEvent 方法对消息进行接收处理。

    3. 事件发布者

    @Component
    public class DemoPublisher {
    
      @Autowired
      ApplicationContext applicationContext;
      
      public void publish(String msg) {
        applicaionContext.publishEvent(new DemoEvent(this, msg));
      }
    }
    

    代码解释:

    • 注入 ApplicaionContext 用来发布事件。
    • 使用 ApplicaionContext 的 publishEvent 方法来发布。

    4. 配置类

    @Configuration
    @ComponentScan("{package}")
    public class EventConfig {
      
    }
    

    5. 运行示例

    public class Main {
    
      public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(EventConfig.class);
        DemoPublisher demoPublisher = context.getBean(DemoPublisher.class);
        demoPublisher.publish("Hello Application Context!");
        context.close();
      }
    }
    

    写在最后

    不要只是看看就好,动手敲敲代码,Run 一次,看看控制台的输出。
    这只是一个最简单、最基本的 Demo,大家看过之后可以发散自己的想法,模拟一个复杂的业务场景来建立一个可以让事件(Application Event)大展拳脚的舞台吧,只有实战才出真知。

    相关文章

      网友评论

          本文标题:Spring 事件:Application Event

          本文链接:https://www.haomeiwen.com/subject/foefottx.html