• Spring ApplicationContext事件处理机制


    ApplicationContext中事件处理是由ApplicationEvent类和ApplicationListener接口来提供的。如果一个Bean实现了ApplicationListener接口,并且已经发布到容器中去,每次ApplicationContext发布一个ApplicationEvent事件,这个Bean就会接到通知。Spring事件机制是观察者模式的实现。
    ApplicationContext中的事件处理是通过ApplicationEvent类和ApplicationListener接口来提供的,
    通过ApplicationContext的publishEvent()方法发布到ApplicationListener;
    在这里包含三个角色:被发布的事件,事件的监听者和事件发布者。
    事件发布者在发布事件的时候通知事件的监听者。
    spring的事件需要遵循以下流程:
    (1)自定义事件:继承ApplicationEvent   当前类的作用
    (2)定义事件监听器:实现ApplicationListener
    (3)使用容器发布事件

    代码实现

    1,容器事件

    package com.example.demo.springEvent;
    
    import org.springframework.context.ApplicationEvent;
    
    /**
     * @Description //TODO 容器事件
     * @Author GaoX
     * @Date 2020/6/29 16:33
     */
    public class MessageEvent extends ApplicationEvent {
    
        private String text;
    
        public String getText() {
            return text;
        }
    
        public void setText(String text) {
            this.text = text;
        }
    
        public MessageEvent(Object source) {
            super(source);
        }
    
        public MessageEvent(Object source, String text) {
            super(source);
            this.text = text;
        }
    
        public void print(){
            System.out.println("监听器调用此方法!!!!!!!!!!!!");
        }
    
    }

    2,监听器

    package com.example.demo.springEvent;
    
    import org.springframework.context.ApplicationEvent;
    import org.springframework.context.ApplicationListener;
    import org.springframework.stereotype.Component;
    
    /**
     * @Description //TODO 监听器
     * @Author GaoX
     * @Date 2020/6/29 16:36
     */
    @Component
    public class MessageListener implements ApplicationListener {
    
        @Override
        public void onApplicationEvent(ApplicationEvent event) {
            //此处可以定义多个ApplicationEvent
            if(event instanceof MessageEvent){
                MessageEvent messageEvent = (MessageEvent)event;
                messageEvent.print();
                System.out.println(messageEvent.getSource());
                System.out.println(messageEvent.getText());
            }
        }
    }

    3,事件发布

    package com.example.demo.springEvent;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @Description //TODO 事件发布
     * @Author GaoX
     * @Date 2020/6/29 16:41
     */
    @RestController
    public class MessagePublishEvent {
    
        private ApplicationContext applicationContext;
    
        public MessagePublishEvent(ApplicationContext applicationContext) {
            this.applicationContext = applicationContext;
        }
    
        @GetMapping("/publishEvent")
        public void publishEvent(String s){
            MessageEvent messageEvent = new MessageEvent("测试发送", "test="+s);
            applicationContext.publishEvent(messageEvent);
        }
    
    }

    控制台打印


     

  • 相关阅读:
    recon-ng打开后显示No modules enabled/installed
    mysql的floor()报错注入方法详细分析
    视频合并时使用python批量修改文件名
    ThinkPHP5框架引入的css等外部资源文件没有生效
    用session实现的用户登陆,客户端是怎样获取到cookie信息的
    关于Linux系统下基于Tomcat部署和升级war包的详细过程
    nginx代理的页面性能优化大全
    linux下MySQL数据库的定时备份与定时删除
    关于linux查询内存,CPU,存储空间和日志查询的的常用命令及参数讲解
    linux 查看cpu核心数
  • 原文地址:https://www.cnblogs.com/gaomanito/p/13208860.html
Copyright © 2020-2023  润新知