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




  • 相关阅读:
    深入浅出Win32多线程程序设计【2】线程控制
    深入浅出Win32多线程程序设计【1】基本概念
    在两个ASP.NET页面之间传递值
    Javascript基础
    DataGrid的几个小技巧
    推荐取代Visio的中国人的软件——Edraw
    ASP.NET如何防范SQL注入攻击
    软件版本号规定原则
    三层体系结构总结(三)
    .Net工具 .NET文档生成工具2.2
  • 原文地址:https://www.cnblogs.com/franson-2016/p/13200979.html
Copyright © 2011-2022 走看看