zoukankan      html  css  js  c++  java
  • Spring Boot 之事件(Event)

    转自:https://msd.misuland.com/pd/2884250137616454018

    Spring 官方文档翻译如下 :

    ApplicationContext 通过 ApplicationEvent 类和 ApplicationListener 接口进行事件处理。 如果将实现 ApplicationListener 接口的 bean 注入到上下文中,则每次使用 ApplicationContext 发布 ApplicationEvent 时,都会通知该 bean。 本质上,这是标准的观察者设计模式。

    Spring的事件(Application Event)其实就是一个观察者设计模式,一个 Bean 处理完成任务后希望通知其它 Bean 或者说 一个Bean 想观察监听另一个Bean的行为。

    Spring 事件只需要几步:

    • 自定义事件,继承 ApplicationEvent
    • 定义监听器,实现 ApplicationListener 或者通过 @EventListener 注解到方法上
    • 定义发布者,通过 ApplicationEventPublisher

    代码示例:

    1. 自定义Event

    @Data
    public class DemoEvent extends ApplicationEvent {
        private Long id;
        private String message;
    
        public DemoEvent(Object source, Long id, String message) {
            super(source);
            this.id = id;
            this.message = message;
        }
    }
    

    2. 监听器

    • 实现ApplicationListener 接口
    
    @Component
    public class DemoListener implements ApplicationListener<DemoEvent> {
    
        @Override
        public void onApplicationEvent(DemoEvent demoEvent) {
            System.out.println(">>>>>>>>>DemoListener>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
            System.out.println("收到了:" + demoEvent.getSource() + "消息;时间:" + demoEvent.getTimestamp());
            System.out.println("消息:" + demoEvent.getId() + ":" + demoEvent.getMessage());
        }
    }
    
     

    泛型为需要监听的事件类型

    • @EventListener
    @Component
    public class DemoListener2 {
    
        @EventListener
        public void onApplicationEvent(DemoEvent demoEvent) {
            System.out.println(">>>>>>>>>DemoListener2>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
            System.out.println("收到了:" + demoEvent.getSource() + "消息;时间:" + demoEvent.getTimestamp());
            System.out.println("消息:" + demoEvent.getId() + ":" + demoEvent.getMessage());
        }
    }
    
    
     

    参数为需要监听的事件类型

    3. 消息发布者

    @Component
    public class DemoPublisher {
    
        private final ApplicationContext applicationContext;
    
        @Autowired
        public DemoPublisher(ApplicationContext applicationContext) {
            this.applicationContext = applicationContext;
        }
    
        public void publish(long id, String message) {
            applicationContext.publishEvent(new DemoEvent(this, id, message));
        }
    
    }
    

    4. 测试方法

    @Test
    public void publisherTest() {
        demoPublisher.publish(1L, "成功了!");
    }
    

    5.结果

    >>>>>>>>>DemoListener2>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    收到了:com.jiuxian.publisher.DemoPublisher@3a62c01e消息;时间:1551762322376
    消息:1:成功了!
    >>>>>>>>>DemoListener>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    收到了:com.jiuxian.publisher.DemoPublisher@3a62c01e消息;时间:1551762322376
    消息:1:成功了!
    
    

    6. 示例源码

    GitHub https://github.com/Zejun-Liu/SpringBoot2.0/tree/master/springboot-event

  • 相关阅读:
    jquery的文档操作
    Websocket简介
    第二次作业
    第一次作业
    本地存储
    轮播图制作
    BOM
    小案例总结
    Web API——DOM
    Web APIs(DOM、BOM)综述
  • 原文地址:https://www.cnblogs.com/sharpest/p/13712567.html
Copyright © 2011-2022 走看看