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

  • 相关阅读:
    站立会议05
    站立会议04
    站立会议03
    站立会议02
    kettle下载、配置及入门使用-数据库表的复制
    eclipse遇到启动报an error has occurred see the log file错 错误 修改了workplace工作空间
    云时代架构之中国民生银行天眼日志平台架构演进的平凡之路
    云时代架构之微店大数据开发平台架构演进
    云时代架构之微博深度学习平台架构和实践
    云时代架构之蘑菇街交易平台数据库架构演进历程
  • 原文地址:https://www.cnblogs.com/sharpest/p/13712567.html
Copyright © 2011-2022 走看看