zoukankan      html  css  js  c++  java
  • spring boot事件如何使用

    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:成功了!




  • 相关阅读:
    访问前端项目时Http请求变成了HTTPS
    Jenkins升级后无法正常启动(java.lang.IllegalStateException: An attempt to save the global configuration ......
    准备开始学习了。
    Nginx的安装与使用
    Linux 学习001
    Nginx为什么比Apache Httpd高效:原理篇
    Asp .Net Core Spa (二)
    Asp .Net Core Spa (一)
    基础笔记(三):网络协议之Tcp、Http
    跨平台运行ASP.NET Core 1.0
  • 原文地址:https://www.cnblogs.com/franson-2016/p/13200979.html
Copyright © 2011-2022 走看看